Получить путь к корневому каталогу проекта PHP

115

У меня есть такая структура папок в моем проекте PHP. (это как показано в затмениях)

-MySystem
    +Code
    +Data_Access
    -Public_HTML
        +css
        +js
        +Templates
    -resources

Когда я пробую этот код

echo $_SERVER['DOCUMENT_ROOT']

выход

D: / рабочее пространство

Как я могу получить путь к RootDirectory системы ( MySystem) без жесткого кодирования имени папки?

Nalaka526
источник

Ответы:

146

Для PHP> = 5.3.0 попробуйте

Магические константы PHP .

__DIR__

И сделай свой путь относительным.

Для PHP <5.3.0 попробуйте

dirname(__FILE__)
Прасад Раджапакша
источник
3
это просто потрясающе, я пробовал $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'] и т. д., но это отлично сработало!
webblover
79
Это зависит от того, где вы используете __DIR__ . Он относится к самому файлу, поэтому, если он включен внутри подкаталога, он не вернет только ваш корневой каталог.
Iris
11
Он не даст корневую директорию
inrsaurabh
2
быстрое примечание для всех, кто наткнется на этот ответ в поисках ответа на заданный вопрос, DIR получает каталог текущего файла, а не корень проекта, если вы не вызываете его в файле, который находится в корне проекта, но поскольку php этого не делает иметь концепцию проекта, все пути должны быть абсолютными или относительными к текущему местоположению
MikeT
Пожалуйста, не голосуйте за ответ, который не дает правильного ответа на вопрос, только потому, что он вам помог.
ElYeante,
73

Когда ты говоришь это

$_SERVER['DOCUMENT_ROOT']

содержит этот путь:

D:/workspace

Тогда D:это то, что вы ищете, не так ли? В этом случае вы можете взорвать строку косой чертой и вернуть первую:

$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];

Это выведет корневой каталог сервера.

Обновление: когда вы используете константу DIRECTORY_SEPARATORвместо жестко запрограммированной косой черты ( '/'), этот код также работает под Windows.

Обновление 2:$_SERVER глобальная переменная не всегда доступна. Например, в командной строке (cli). Поэтому вы должны использовать __DIR__вместо $_SERVER['DOCUMENT_ROOT']. __DIR__возвращает путь к самому файлу php.

Armin
источник
2
И вы можете использовать __DIR__вместо $_SERVER['DOCUMENT_ROOT'].
Армин
Извините, если я не объяснил свой вопрос должным образом, на самом деле мне нужно «D: / workspace / MySystem»
Nalaka526,
1
если путь к корневому каталогу имеет вид / var / public / www ", то при использовании этого метода первая строка в массиве будет пустой (0) / (1) / (2) / (3). корень будет вторая строка $ pathInPieces [1]
tbradley22
36

используйте функцию PHP:

getcwd()

Получает текущий рабочий каталог.

dkinzer
источник
1
Это возвращает CURRENT путь к исполняемому файлу. Не корневой путь
Юша Алеайуб
9

Я хочу указать, как Wordpress с этим справляется:

define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );

Поскольку Wordpress очень широко используется во всем Интернете, а также отлично работает локально, я очень доверяю этому методу.

Hexodus
источник
1
Я думаю, это работает только тогда, когда у вас есть два уровня каталогов. Правильно? Я имею в виду, что при вызове его из base_project_directory / folder1 / folder2 / folder3 / file.php он не возвращает base_project_directory.
Али Халили
«Поскольку Wordpress очень широко используется в Интернете, а также отлично работает локально, я очень доверяю этому методу». Я не считаю, что это особенно хороший аргумент, учитывая качество кода WP и послужной список безопасности.
Alex Barker
1
@AlexBarker Я бы оспорил тот факт, что вы намекаете, что у WP плохая репутация в области безопасности. На самом деле это довольно безопасно, и у него есть отзывчивая команда, ориентированная на безопасность - в последние годы у ядра было очень мало уязвимых проблем безопасности (в том числе, когда вы комментировали).
Уильям Паттон,
3

можешь попробовать: $_SERVER['PATH_TRANSLATED']

цитата:

Путь к текущему скрипту, основанный на файловой системе (а не на корне документа), после того, как сервер выполнил любое сопоставление виртуального и реального. Примечание. Начиная с PHP 4.3.2, PATH_TRANSLATEDбольше не устанавливается неявно в SAPI Apache 2, в отличие от ситуации в Apache 1, где для него установлено то же значение, что и SCRIPT_FILENAMEдля переменной сервера, когда она не заполняется Apache.
Это изменение было внесено в соответствии со спецификацией CGI, согласно которой PATH_TRANSLATED должен существовать, только если PATH_INFOон определен. Пользователи Apache 2 могут использовать AcceptPathInfo = Onвнутри httpd.confдля определенияPATH_INFO

источник: php.net/manual

Это я
источник
1
echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;
Вакар Аламгир
источник
0

Резюме

В этом примере предполагается, что вы всегда знаете, где находится корневая папка apache «/ var / www /», и пытаетесь найти путь к следующей папке (например, «/ var / www / my_website_folder»). Также это работает из сценария или веб-браузера, поэтому есть дополнительный код.

Код PHP7

function getHtmlRootFolder(string $root = '/var/www/') {

    // -- try to use DOCUMENT_ROOT first --
    $ret = str_replace(' ', '', $_SERVER['DOCUMENT_ROOT']);
    $ret = rtrim($ret, '/') . '/';

    // -- if doesn't contain root path, find using this file's loc. path --
    if (!preg_match("#".$root."#", $ret)) {
      $root = rtrim($root, '/') . '/';
      $root_arr = explode("/", $root);
      $pwd_arr = explode("/", getcwd());
      $ret = $root . $pwd_arr[count($root_arr) - 1];
    }

    return (preg_match("#".$root."#", $ret)) ? rtrim($ret, '/') . '/' : null;
}

пример

echo getHtmlRootFolder();

Вывод:

/var/www/somedir/

Подробности:

В основном сначала пытается получить DOCUMENT_ROOT, если он содержит '/ var / www /', затем используйте его, иначе получите текущий каталог (который много существует внутри проекта) и получает следующее значение пути на основе количества корневого пути $. Примечание: добавлены операторы rtrim, чтобы гарантировать, что возвращаемый путь заканчивается на '/' во всех случаях. Он не проверяет, должен ли он быть больше, чем / var / www /, он также может возвращать / var / www / в качестве возможного ответа.

Майк Кью
источник