Что лучше для require (dirname (__ FILE __). '/'. 'MyParent.php'), чем просто require ('myParent.php')? - PullRequest
17 голосов
/ 08 февраля 2010

Множество известных PHP-скриптов, включая WordPress, используют dirname(__FILE__).'/myParent.php' вместо просто 'myParent.php' при включении файлов в один и тот же каталог запущенного в данный момент скрипта.

Разве это не одно и то же?Почему вы предпочитаете печатать больше?

Спасибо.

Ответы [ 4 ]

17 голосов
/ 08 февраля 2010

PHP должен знать абсолютный путь к файлу. dirname(__FILE__).'/myParent.php' уже является абсолютным путем, но 'myParent.php' требует поиска с использованием указанных путей в include_path , чтобы получить абсолютный путь и найти файл. Лучшим выбором будет './myParent.php':

Однако более эффективно явно использовать include './file', чем когда PHP всегда проверяет текущий каталог для каждого включения.

14 голосов
/ 08 февраля 2010

Помимо увеличения производительности (которое в большинстве случаев является предварительной оптимизацией *), оно также защищает от (очень странного) сценария, когда в конфигурации PHP среды отсутствует текущий каталог (.) Путь включения.

* Тест include, использующий путь, который требует поиска include_path, а не относительный путь. Проверено более 100000 итераций каждая

Результаты

include("include.php"):   8.3664200305939s
include("./include.php"): 8.3511519432068s

(8.3664200305939 - 8.3511519432068) / 100000 = 0.000000152680874s

Если вы не включили сотни или тысячи файлов, 0.0000001s в лучшем случае незначительны.

Тестовый код

define("MAX", 100000);

ob_start();
$i = MAX;
$_t = microtime(true);
do {
    include("include.php");
} while ( --$i );
$_t = microtime(true) - $_t;
ob_end_clean();

echo "include(\"include.php\"):  {$_t}s\n";

ob_start();
$i = MAX;
$_t = microtime(true);
do {
    include("./include.php");
} while ( --$i );
$_t = microtime(true) - $_t;
ob_end_clean();

Тест проводился на MacBook 10.5.8 с частотой 2,16 ГГц с версией PHP 5.2.9 (www.entropy.ch, выпуск 7)

12 голосов
/ 08 февраля 2010

Использование dirname + имя файла немного быстрее, потому что PHP не будет перебирать include_path в поисках файла. Если скорость имеет значение, вы, скорее всего, наберете больше.

7 голосов
/ 26 августа 2012

Добавлено примечание о include ('./ file.php').

Если имеет значение только скорость, тогда да, вы можете использовать include ('./ file.php'), но если вы хотите разрешить проблемы с зависимостями и относительными путями, лучше использовать dirname (__ FILE __), потому что

include('./file.php')

по-прежнему будет создавать пути относительно исполняемого скрипта (, включая скрипт), а

include(dirname(__FILE__).'/file.php');

разрешит пути относительно текущего скрипта, в котором находится эта строка ( включенный скрипт).

Как правило, лучше использовать dirname (__ FILE __), поскольку «./» дает лишь незначительное увеличение производительности, в то время как dirname (__ FILE __) дает вам более надежное включение.

/ EDIT: также обратите внимание, что вышеупомянутый тест касается только include('./something.php'), который действительно быстрее, чем include('something.php'), потому что у вас нет прогулки по include_path, но когда вы используете dirname(__FILE__), вы получаете dirname() Затраты на вызов функции, что делает его медленнее обхода include_path (если в вашем include_path нет много путей).

...