Множество известных PHP-скриптов, включая WordPress, используют dirname(__FILE__).'/myParent.php'
вместо 'myParent.php'
при включении файлов в тот же каталог текущего скрипта.
Разве они не то же самое? Почему вы предпочитаете печатать больше?
Благодарю.
PHP должен знать абсолютный путь к файлу. dirname(__FILE__).'/myParent.php'
уже является абсолютным путем, но 'myParent.php'
требует поиска с использованием заданных путей в include_path для получения абсолютного пути и поиска файла. Лучшим выбором будет './myParent.php'
:
Тем не менее, более эффективно явно использовать
include './file'
чем PHP, всегда проверяющий текущий каталог для каждого include.
Помимо увеличения производительности (что, вероятно, является предварительным оптимизацией в большинстве случаев *), оно также защищает от (очень странного) сценария, когда в конфигурации 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();
в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();
в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 Release 7)
Использование dirname + имя файла немного быстрее, потому что PHP не будет проходить через include_path для поиска файла. Если скорость имеет значение, вы, скорее всего, напечатаете больше.
Добавлено примечание о 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).