Как программно определить корень документа в PHP?

Вот проблема, с которой я столкнулся в последнее время – неправильно сконфигурированный 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/ .

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

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

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

это должно сделать трюк

Нет необходимости изменять все сценарии.

Вы можете запустить PHP-файл до запуска любого скрипта с помощью auto_prepend_file .

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

Это одна из причин, по которым люди перебирают все через bootstrap /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__ ) ); 

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

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

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

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

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

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

эти вещи, как правило, замирают в вашем коде и никогда не удаляются (но все еще активны), пока кто-то окончательно не зафиксирует сервер. Все снова сломается.

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