относительные и абсолютные пути 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");

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

8 ответов


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

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

затем сделать

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

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

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

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

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


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


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

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

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


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

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

Zend framework делает что-то подобное для загрузки классов библиотеки.


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

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

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


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

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


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

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