Как программно определить корень документа в PHP? - PullRequest
6 голосов
/ 24 декабря 2008

Вот проблема, с которой я столкнулся в последнее время - неправильно настроенный apache на веб-хосте. Это означает, что все сценарии, использующие $_SERVER['DOCUMENT_ROOT'], прерываются. Самый простой обходной путь, который я нашел, - это просто установить переменную в некоторых глобальных включаемых файлах, которые являются общими, но не стоит забывать об этом. У меня вопрос, как мне определить правильный корень документа программно?

Например, на одном хосте установка выглядит так:

$_SERVER['DOCUMENT_ROOT'] == '/htdocs'

Настоящие корни документов:

test.example.com -> /data/htdocs/example.com/test
www.example.com -> /data/htdocs/example.com/www

И я хотел бы, чтобы скрипт, запускаемый с www.example.com/blog/ (по пути /data/htdocs/example.com/www/blog), получил правильное значение /data/htdocs/example.com/www.

На другом хосте установка немного отличается:

$_SERVER['DOCUMENT_ROOT'] == '/srv'
test.example.com -> /home/virtual_web/example.com/public_html/test
www.example.com -> /home/virtual_web/example.com/public_html/www

Есть ли какое-нибудь решение для этого? Или это единственный способ просто не полагаться на $_SERVER['DOCUMENT_ROOT'] и исправлять все программное обеспечение, которое я запускаю на своих сайтах? Исправить это на стороне хостинга, кажется, не вариант, я еще не сталкивался с хостом, где он был настроен правильно. Лучшим, что я получил, был корень документа, указывающий на www.example.com, который был по крайней мере внутри open_basedir - они использовали еще одну схему именования, www.example.com указывал бы на /u2/www/example_com/data/www/.

Ответы [ 6 ]

7 голосов
/ 24 декабря 2008

В PHP5 есть магическая константа __FILE__, которая содержит абсолютный путь к файлу, в котором она появляется. Вы можете использовать его в сочетании с dirname для вычисления корня документа.

Вы можете поместить утверждение, подобное следующему, в файл конфигурации

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

это должно сработать

3 голосов
/ 24 декабря 2008

Нет необходимости изменять все скрипты.

Файл PHP можно запустить до запуска любого скрипта, используя auto_prepend_file.

$_SERVER это просто массив, вы можете изменить его и установить правильный $_SERVER['DOCUMENT_ROOT'].

2 голосов
/ 24 ноября 2012

На основании http://www.helicron.net/php/:

$localpath=getenv("SCRIPT_NAME");
$absolutepath=getenv("SCRIPT_FILENAME");
$_SERVER['DOCUMENT_ROOT']=substr($absolutepath,0,strpos($absolutepath,$localpath));     

Мне пришлось изменить трюк с базовым именем / реальным путем, потому что он возвратил пустую строку на моем хосте. Вместо этого я использую SCRIPT_FILENAME. Это, вероятно, больше не будет работать на IIS (но оригинальные сценарии, которые использовали переменную $ _SERVER, вероятно, тоже не будут).

2 голосов
/ 24 декабря 2008

Это одна из причин, по которой люди все перекачивают через загрузочный файл /index.php, используя htaccess и / или строки запроса. Вы можете использовать вышеупомянутый трюк dirname( __FILE__ ) и таким образом получить публичную базу своего приложения.

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

function findAppBase( $dir ) {
    if( file_exists( "$dir/unique_file.txt" ) ) {
        return $dir;

    return findAppBase( dirname( $dir ) );
}

$base = findAppBase( dirname( __FILE__ ) );

Этот код не был протестирован, и может быть более плавный способ использования переменных в $_ENV или $_SERVER, которые будут делать то, что вы хотите ...

0 голосов
/ 24 декабря 2008

Почему бы не потребовать, чтобы ваш веб-хост настроил свои серверы правильно?

Подобные вещи имеют тенденцию молчать в вашем коде и никогда не удаляются (но остаются активными), пока кто-то окончательно не исправит сервер. Тогда все снова сломается.

Или переместите ваши вещи на хост, который будет работать. Если это сломано, кто знает, что вы найдете дальше.

0 голосов
/ 24 декабря 2008

PHP должен устанавливать текущий каталог в тот, в котором находится скрипт, поэтому, пока он не сломан, вы сможете определить корень документа, используя $_SERVER['SCRIPT_FILENAME'] и getcwd(). (Я не могу вспомнить все переменные $ _SERVER в моей голове, в phpinfo () может быть что-то более полезное.)

...