php относительные и абсолютные пути

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

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

include("includes/myscript.php"); 

или

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

или даже

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

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

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

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

Тогда сделайте

 require ROOT . '/include/file.php'; 

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

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

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

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

Я написал простой скрипт проверки скорости, используя 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. 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. 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. 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'); 

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

     Абсолютный путь: 263.222
     Предопределенный путь: 263.545
     Относительный путь: 301.214
     Использование set_include_path (): 302.396
     Суперглобальный путь: 269.631

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

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

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

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

 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 лет (я предполагаю), я бы не стал беспокоиться об этом. Просто пойдите с относительными путями. Разница во времени не будет заметна. Если вы разрабатываете большое веб-приложение и будете иметь сотни, это может быть другая история …

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

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

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

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

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

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

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

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

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

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