PHP относительные и абсолютные пути - PullRequest
13 голосов
/ 18 ноября 2009

Я прочитал, что при включении php-файла, который использует абсолютные пути, быстрее обрабатывается, чем относительные пути.

Что бы вы предложили использовать?

include("includes/myscript.php");

или

include("/home/ftpuser/public_html/includes/myscript.php");

или даже

set_include_path("/home/ftpuser/public_html/includes");
include("myscript.php");

Или это то, о чем мне действительно не стоит беспокоиться?

Ответы [ 8 ]

16 голосов
/ 18 ноября 2009

Я обычно устанавливаю константу, либо вручную, либо так:

define('ROOT', dirname(__FILE__));

Тогда сделай

require ROOT . '/include/file.php';
8 голосов
/ 18 ноября 2009

Это лучший метод для 99% случаев:

include(dirname(__FILE__)."/includes/myscript.php");

В конечном итоге это абсолютный путь, а это значит, что он игнорирует include_path, который является известным источником большого количества ошибок, связанных с моим опытом ...

Хотя с точки зрения производительности, я сомневаюсь, что между абсолютным и относительным путями есть большая разница. Это своего рода микрооптимизация, которая ничего не значит в долгосрочной перспективе. Обычно в include_path будет только 2-3 вещи, если вы не добавите больше. Два обычных виновника - ./ и путь к месту установки pear.

7 голосов
/ 13 февраля 2013

Я написал простой скрипт теста скорости, используя microtime(true). Он тестирует следующие пять, включая методы с миллионом итераций:

// Absolute path.
include('/home/ftpuser/public_html/includes/myscript.php');

// Predefined path.
define('PATH', '/home/ftpuser/public_html/includes/');
include(PATH . 'myscript.php');

// Relative path.
include('myscript.php');

// Using set_include_path().
set_include_path('/home/ftpuser/public_html/includes/');
include('myscript.php');

// Superglobal path.
include(dirname(__FILE__) . '/myscript.php');


Который дал следующие результаты (в секундах):

    Absolute path:            263.222
    Predefined path:          263.545
    Relative path:            301.214
    Using set_include_path(): 302.396
    Superglobal path:         269.631


Мое мнение, основанное на этих результатах, состоит в том, чтобы использовать предопределенный путь, потому что это самый быстрый путь, превосходящий только абсолютный путь. Тем не менее, абсолютный путь имеет тот недостаток, что его необходимо изменять в каждом файле, когда это необходимо.

Надеюсь, это помогло. :)

P.S.
define и set_include_path() использовались только один раз во время выполнения скрипта (они расположены вне цикла).

3 голосов
/ 18 ноября 2009

Определенно не кодируйте свои пути жестко, как второй вариант. Хорошая альтернатива:

define('BASE_DIR', '/home/ftpuser/public_html/includes');
include(BASE_DIR . '/myscript.php');
include(BASE_DIR . '/myscript2.php');
include(BASE_DIR . '/myscript3.php');
include(BASE_DIR . '/myscript4.php');

Учитывая, что у вас, вероятно, будет от 5 до 50 включений (я полагаю), я бы не стал беспокоиться об этом. Просто иди с относительными путями. Разница во времени включения даже не будет заметна. Если вы разрабатываете большое веб-приложение, а их будет сотни, это может быть другая история ...

2 голосов
/ 18 ноября 2009

Я склонен настраивать мои каталоги / библиотеки включений, задавая путь включения при инициализации моего приложения.

set_include_path("/home/ftpuser/public_html/includes");
include("myscript.php");

Zend Framework делает нечто похожее на загрузку классов библиотеки.

1 голос
/ 18 ноября 2009

Самое важное - расположить включаемые пути так, чтобы наибольшее количество require / include -колланов перехватывалось в первом упомянутом пути , если не включать файл через абсолютный путь. во-первых.

Сложно полагаться на включение всего по абсолютному пути, поскольку изменение пути к вашей библиотеке означает индивидуальное изменение всех файлов, ссылающихся на нее, вместо изменения пути включения в одном месте.

1 голос
/ 18 ноября 2009

когда не используется абсолютный путь, php пытается найти файл во всех путях включения, пока не найдет совпадение.

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

Я думаю, что это может также вызвать осложнения, когда один и тот же относительный путь / имя файла встречаются несколько раз в файловой системе, и, таким образом, php выбирает первый случай, когда вам может понадобиться другой случай

0 голосов
/ 18 ноября 2009

Было бы хорошо, чтобы вы протестировали все методы, проверив время, необходимое для их выполнения, лично я никогда не беспокоился об этом и просто использовал относительные пути.

Полагаю, что абсолютные пути будут немного быстрее, возможно, стоит поинтересоваться, что произойдет с ошибкой, будет ли она указывать полный путь к файлу на экране пользователей (очевидно, отключит error_reporting), и это вызовет угрозу безопасности?

...