Получить Root Directory Path для PHP-проекта

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

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

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

echo $_SERVER['DOCUMENT_ROOT']

вывод

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

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

Ответ 1

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

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

__DIR__

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

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

dirname(__FILE__)

Ответ 2

Когда вы говорите, что

$_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.

Ответ 3

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

getcwd()

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

Ответ 4

Я хочу указать, как Wordpress обрабатывает это:

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

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

Ответ 5

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

цитата:

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

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

Ответ 6

echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;

Ответ 7

Резюме

В этом примере предполагается, что вы всегда знаете, где находится корневая папка 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 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/', затем использовать его, иначе получить текущий каталог (который существует внутри проекта) и получить значение следующего пути на основе счетчика пути $ root. Примечание: добавлены операторы rtrim для обеспечения возврата пути, заканчивающегося символом "/" во всех случаях. Он не проверяет, требует ли он больше /var/www/, также может возвращать/var/www/в качестве возможного ответа.