Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Корневой каталог сайта


Автор: artsb 11.9.2008, 15:03
Всем привет!

Такой вопрос: как получить корневой каталог сайта?

Я получаю его из массива $_SERVER['DOCUMENT_ROOT']. Но недавно на каком-то форуме прочитал о том, что это работает не на всех серверах. Так ли это? Если да, то как тогда его получить?

Автор: Sunvas 11.9.2008, 16:30
Есть несколько вариантов. Первый:
Код

$root=dirname( __FILE__ );


Второй:
Код

$root=getcwd();

Автор: artsb 11.9.2008, 21:50
И оба варианта вернут КОРНЕВОЙ КАТАЛОГ САЙТА? И оба будут РАБОТАТЬ ВЕЗДЕ?

Автор: Sunvas 11.9.2008, 22:33
artsb, насколько я понял, Вам нужен полный путь к папке с сайтом? Т.е. например /home/username/public_html/site.ru/ ? Если да, то на оба вопроса, ответ да.

Автор: americanets 12.9.2008, 11:47
Цитата(Sunvas @  11.9.2008,  17:30 Найти цитируемый пост)
dirname( __FILE__ );



но не стоит забывать что это не рут дирректория а полный путь к папке с вызываемым скриптом 

Автор: Sunvas 12.9.2008, 13:30
А что понимается под "рут" директорией?

Автор: americanets 12.9.2008, 13:38
Код

$_SERVER['DOCUMENT_ROOT']


Код

/home/www/ 


к примеру

Автор: Sunvas 12.9.2008, 13:59
И все-равно это полный путь к сайту. Выполните мои команды в index.php - получите тоже самое.

Автор: artsb 12.9.2008, 18:27
Ладно, спасибо за советы.

Автор: americanets 15.9.2008, 09:16
Sunvas, тогда излагайся есней smile 
например есть конфиг в нем  что - то вроде этого нужно писать в зависимости от задачи


Код

if ( isset($_SERVER['DOCUMENT_ROOT']) and !empty($_SERVER['DOCUMENT_ROOT']) ) {
    if (substr($_SERVER['DOCUMENT_ROOT'], -1) == "/" or substr($_SERVER['DOCUMENT_ROOT'], -1) == "\\") {
        $_SERVER['DOCUMENT_ROOT'] = substr($_SERVER['DOCUMENT_ROOT'], 0, strlen($_SERVER['DOCUMENT_ROOT']) - 1);
    }
} else {
    $_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__);
}

Автор: Sunvas 15.9.2008, 16:34
americanets, не очень понял, что Вам ясней объяснить..

ЗЫ. Эта конструкция улыбнула:
Код

$_SERVER['DOCUMENT_ROOT'] = substr($_SERVER['DOCUMENT_ROOT'], 0, strlen($_SERVER['DOCUMENT_ROOT']) - 1);


А зачем еще и strlen($_SERVER['DOCUMENT_ROOT']) ?

Автор: americanets 15.9.2008, 17:10
Sunvas, это старенький кусок кода и вправду пора его пересмотреть smile

Автор: sTa1kEr 16.9.2008, 13:56
Цитата(artsb @  11.9.2008,  16:03 Найти цитируемый пост)
Но недавно на каком-то форуме прочитал о том, что это работает не на всех серверах. 

По сути верно, разные сервера могут писать туда совсем не те пути, которые ожидает программист. К примеру, если в качестве веб сервера используется IIS с рутовой директорией C:\wwwroot\, а сам сам сайт на виртуальном хосте по пути C:\sites\mydomain.ru\, то в DOCUMENT_ROOT все равно попадет C:\wwwroot\, что приведет к ошибкам.

Самый надежный вариант предложил Sunvas с константой __FILE__. Просто кладем в рутовую директорию файлик, к примеру, root.php
Код

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

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

Однако, если вы используете для своего проекта исключительно апач, и не собираетесь этот скрипт распространять, то DOCUMENT_ROOT-а будет более чем достаточно.

Автор: artsb 16.9.2008, 21:44
Вы тут без меня общаетесь smile

Спасибо всем за советы.

Автор: artsb 20.9.2008, 22:26
Продолжу тему.

Для получения root директории использую код:
Код

    $rootdir = dirname(__FILE__);
    $pos = 0;
    for($pos = -4; $pos > 0; $pos = strpos($rootdir, '/www/', $pos + 4)); // ищем последнее '/www/'
    $rootdir = substr($rootdir, 0, $pos + 4);

Я проверял его под Windows. Вопрос в том, как он поведёт себя на других ОС.

Автор: Sunvas 20.9.2008, 23:21
artsb, извини, но что за шиза?
Код

$pos=strrpos($rootdir, '/www/');

Вернет последнее вхождение этой подстроки.

Автор: artsb 21.9.2008, 16:07
В справочнике написано:
Код

int strrpos ( string $haystack, string $needle [, int $offset] )

Возвращает позицию последнего вхождения needle в строку haystack. В PHP 4 используется только первый символ строки needle. 

Получается, в этом случае:
Код

$pos=strrpos($rootdir, '/www/');

будет использоваться только '/'?

Автор: Sunvas 21.9.2008, 16:50
Хватит топтаться на PHP4, пора переодить на PHP5.

Автор: artsb 21.9.2008, 17:04
Я знаю, но на сервере 4-ка

Автор: Sunvas 21.9.2008, 18:25
Еще немного и PHP 4 будет антиквариатом. Ну хорошо, забираю свои слова обратно smile

Автор: artsb 21.9.2008, 22:09
Да ладно. smile

Кстати, тот скрипт работал не корректно. Так лучше:
Код

    $rootdir = dirname(__FILE__);
    $pos = 0;
    $tpos = 0;
    $rootdir = str_replace("\\", "/", $rootdir);
    while(true) 
    {
        $tpos = strpos($rootdir, '/www/', $pos);
        if($tpos!==false) $pos += $tpos + 5;
        else break;
    }
    $rootdir = substr($rootdir, 0, $pos);


Это, по-моему, универсальный вариант.

Автор: Sunvas 21.9.2008, 22:29
Как вариант, еще могу предложить вариацию на основен strrev. Интересует?

Автор: sTa1kEr 22.9.2008, 11:15
Цитата(Sunvas @  21.9.2008,  19:25 Найти цитируемый пост)
Еще немного и PHP 4 будет антиквариатом.

Уже, только скорее не антиквариат, а анахронизм.

Цитата(artsb @  21.9.2008,  23:09 Найти цитируемый пост)
Кстати, тот скрипт работал не корректно. Так лучше:

Жесть. Зачем такие пляски с бубном, почему просто не положить сам скрипт на один уровень выше www? Тогда можно будет оставить только первую строчку.

Автор: artsb 22.9.2008, 18:36
Sunvas, smile развороты - это уж слишком. Спс.


sTa1kEr, по поводу жести вы правы. smile Но у меня есть скрипты в подпапках. Как я из них узнаю путь до файла, который лежит в корне smile

Автор: sTa1kEr 22.9.2008, 18:51
Цитата(artsb @  22.9.2008,  19:36 Найти цитируемый пост)
Как я из них узнаю путь до файла, который лежит в корне smile 

Вы же знаете где именно лежит скрипт, т.ч. можете добраться до него по относительному пути:
Код

include_once ('../../../base.php');

Автор: artsb 22.9.2008, 23:15
sTa1kEr, мне кажется, это тоже жесть. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)