Иногда $_SERVER['DOCUMENT_ROOT']
возвращается с завершающей косой чертой. В других средах это не так. Где это можно указать?
Вы не можете сказать заранее, если $_SERVER['DOCUMENT_ROOT']
содержит косую черту в конце или нет.
Обычно, если он правильно настроен, он не содержит конечной косой черты. В Ubuntu (как и в других UNIX) правильно написанный путь к каталогу не имеет /
в конце. Например, в Windows apache даже откажется запускаться, если он настроен на один. В UNIX Apache не является разборчивым и позволяет с завершающим косой чертой.
Но есть одно исключение, если вы создаете свой корневой каталог ( /
) ваш корень документа. Из-за этого случая вы не можете заранее сказать, содержит ли он конечную косую черту.
В любом случае он содержит значение директивы DocumentRoot
– с или без конечной косой черты, как это было записано в файле конфигурации httpd. PHP использует только значение apache. Чтобы получить реальный корень документа, используйте realpath
и / или условно добавьте косую черту (или удалите ее) в конце, если либо в вашем файле конфигурации, либо в вашем PHP-коде.
Я использую текущий каталог больше, чем я использую docroot, потому что он также хорошо работает в командной строке и в модульных тестах. Я обычно использую что-то вроде:
require_once(dirname(__FILE__).'/../../../../constants.php');
Скорее, чем:
require_once($_SERVER['DOCUMENT_ROOT'].'/../constants.php');
Я впервые увидел его в источнике WordPress и ему очень понравилось, но это может привести к повторению «../».
PS FILE – это текущий файл, и dirname отделяет /something.php от конца, оставляя путь к каталогу, содержащему текущий файл.
Вы можете сделать это так, чтобы убедиться, что конечная косая черта всегда присутствует
'/'. trim ($ _SERVER ['DOCUMENT_ROOT'], '/'). '/'
require_once( '/'.trim( $_SERVER['DOCUMENT_ROOT'], '/' ).'/'.'constants.php' );
Я думаю, что это зависит от конфигурации сервера, если веб-корень определяется с помощью косой черты или без нее. Просто проверьте, что это на каждой системе равно.
См. Также ServerRoot-директиву документации apache.
Ответ Хакре правильный. Я пытался использовать include в разных ситуациях, в консольном скрипте или на веб-сервере. Лучше всего было использовать абсолютный путь, начиная с DOCUMENT_ROOT. Но я все еще застрял из-за этой задней черты. Вот что кажется хорошим решением:
include_once getenv ("DOCUMENT_ROOT"). " ./ WEB-INF / classes
Затем вызовите ваш скрипт с php test.php из пакетного скрипта и поместите значение в переменную enct DOCUMENT_ROOT или нет, с завершающей косой чертой или нет. При загрузке из apache getenv уже заполнен.
PHP-движок может работать с ./ ./, сообщая ему то же, что и ./. Точно так же htdocs./ интерпретируется htdocs / (под окнами)
Старый вопрос, я знаю, но так как это дало мне представление, как решить это для себя, я просто добавлю свое решение здесь. Я хотел определить константу (ROOTPATH) с помощью $ _SERVER ['DOCUMENT_ROOT'] и убедиться, что она имеет завершающую косую черту (DIRECTORY_SEPARATOR).
define('ROOTPATH', (ctype_alnum(substr($_SERVER['DOCUMENT_ROOT'], -1)) ? $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR : $_SERVER['DOCUMENT_ROOT']));
Это предполагает, что последний символ имени папки является буквенно-цифровым (я не мог вспомнить много имен папок, которые заканчиваются специальными символами). Если вы хотите убедиться, что нет косой черты, вы можете пойти примерно так:
define('ROOTPATH', (!ctype_alnum(substr($_SERVER['DOCUMENT_ROOT'], -1)) ? substr($_SERVER['DOCUMENT_ROOT'], 0, -1) : $_SERVER['DOCUMENT_ROOT']));
Мир, Мо