Эта тема на forum.dklab.ru


gri: Использование $DOCUMENT_ROOT для include
Написал дома свой первый сайт в PHP 4.3.9 (пакет Денвер), выложил его, и выяснил, что переменная $DOCUMENT_ROOT совершенно не пригодна для написания строк типа include_once($DOCUMENT_ROOT."/lib/func/gb.php"); ! На хосте в ней содержался совсем другой корень, к которому у меня доступа не было. Пришлось выходить из положнения вручную написав константу для библиотекоря, запускающегося с помощью обработчика. Такое решение очень не красиво!
Есть в ПХП константа, или переменная окружения, всегда содержащая нужный корень? Если нет, то какие более изящные способы решения проблемы вы можете посоветовать?
Дмитрий Котеров:
$_SERVER['DOCUMENT_ROOT']

"Нужный" - это какой?
Rumata:
вообще-то $DOCUMENT_ROOT (или точнее $_SERVER['DOCUMENT_ROOT']) указывает на корневую папку вашего сайта
но вам ничто не мешает писать

include_once "lib/func/gb.php";

в любом случае поиск начнется от корневой папки вашего сайта
bæv:
gri, смотрите phpinfo() своего сайта -- какие глобальные переменные куда указывают.
Юрий Насретдинов:
gri
chdir() - во-первых,

ini_set('include_path',...); - во-вторых
gri:
Перечитал phpinfo() и распечатку $GLOBALS...
"Нужный" - это какой?
$_SERVER['DOCUMENT_ROOT'] = "/usr/local/apache/htdocs", а нужно "/home/домен/субдомен".
include_once "lib/func/gb.php";
в любом случае поиск начнется от корневой папки вашего сайта
Разве? Может быть include_once "/lib/func/gb.php"; , хотя и так скрипт работать не хочет... Ему нужен реальный путь.
chdir() - во-первых
Это значит скрипт, определяющий какую-нибудь $My_DOCUMENT_ROOT должен быть в корне.
ini_set('include_path',...); - во-вторых
А что туда писать? Корень который ты должен знать заранее, или dirname(__FILE__) (и снова скрипт должен запускаться из корня)?

Было бы здорово переносить сайт на другой хост не задумываясь о "корне"... Это реально?
Rumata:
Разве? Может быть include_once "/lib/func/gb.php"; , хотя и так скрипт работать не хочет... Ему нужен реальный путь
где-то мы с Юрой на эту тему говорили на этом форуме
так вот


include "path/file";
include "/path/file";
include $_SERVER['DOCUMENT_ROOT'] . "/path/file";

1. относительный путь, то есть поиск начинается относительно вашего местонахождения, то есть корня вашего сайта
2. абсолютный путь, поиск начинается с начала корневой системы (если такой папки и такого файла нет, то вам грозит ошибка времени выполнения)
3. абсолютный путь, так как $_SERVER['DOCUMENT_ROOT'] уже содержит начало абсолютного пути

если Денвер расположен на диске Z:, а ваш сайт в Денвере находится по адресу Z:/home/site/www
то и $_SERVER['DOCUMENT_ROOT'] == Z:/home/site/www

фактически вариант 1 будет выполнятся относительно этого адреса (есть такое понятие - текущая папка; так у вашего сайта текущая папка равна содержимому $_SERVER['DOCUMENT_ROOT'])
вариант 2 выдаст ошибку
вариант 3 в отличие от варианта 2 - абсолютная адресация

при переносе на другой хост, например к хостеру, у которого ваш сайт будет лежать в папке /var/home/s/si/site/public_html
$_SERVER['DOCUMENT_ROOT'] == /var/home/s/si/site/public_html

и все выше сказанное действительно и для него
Rumata:
Это реально?
это реально.

пишите относительный путь или пишите абсолютный с указание $_SERVER['DOCUMENT_ROOT']
gri:
Спасибо за подробные разъяснения, но видимо Вы меня не поняли.
Переменная $_SERVER['DOCUMENT_ROOT'] = "/usr/local/apache/htdocs", то есть совершенно не вида /var/home/s/si/site/public_html.
Видимо в данном случае это особенность файловой системы хостера, или изменены переменные окружения.
Rumata:
не знаю, что у вас там такое.
но вот еще один вариант

// main_file
include dirname(__FILE__) . '/path/file';


это в том случае если

путь к сайту/
|
|---/path
|---main_file

SNiP:
самый верный вариант:
хук с левой в подбородок, админу хостинга.

Как вариант в виде костыля, если у вас скрипты работают с ДОКУМЕНТ_РУТ (что по-моему не очень хорошо), то переопределите ее в каком-либо конфиг файле, который подключается ко всем скриптам в самом начале, если такого конфига еще нет, то создайте его.
Юрий Насретдинов:
gri
Лично у меня таких проблем уже давно не возникает, т.к. у меня просто всё централизованно идёт через один скрипт, который за всё отвечает... И не распихиваю я по 10 папкам кучу PHP-файлов... Это уже обсуждалось, и неоднократно...

Эта тема на forum.dklab.ru