Я прочитал, что при включении 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), и это вызовет риск безопасности?