Способы определения document root в PHP для администрирования файлов

Раздел: Администрирование PHP -> Работа с файлами

Определение корневой директории сервера в PHP

Как получить корневую директорию веб-сервера, которая является документ-рутом, в PHP?

Наиболее эффективный и рекомендуемый способ - использование суперглобальной переменной $_SERVER['DOCUMENT_ROOT'], которая возвращает абсолютный путь к корневому каталогу, указанному в конфигурации веб-сервера (например, DocumentRoot в Apache).


<?php
$root = $_SERVER['DOCUMENT_ROOT'];
echo $root;
?>
  

Index php path (пути файлов в php)

/var/www/html
  

Php tmp files (временные файлы php)

Этот метод работает в большинстве веб-окружений (Apache, Nginx при правильной конфигурации) и обеспечивает прямой доступ к корню сайта. Однако важно проверить, что переменная определена, особенно при запуске из командной строки (CLI).

Типичная ошибка:

В CLI или при вызове скрипта через php -f переменная $_SERVER['DOCUMENT_ROOT'] может отсутствовать, что вызовет предупреждение. Решение - проверка с помощью isset() или установка значения по умолчанию.


<?php
$root = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : __DIR__;
echo $root;
?>
    

Edit file php (редактирование php файла)

Также стоит учитывать, что при использовании виртуальных хостов или редиректов (например, через RewriteRule) DOCUMENT_ROOT может указывать на другой каталог.

Как определить корневую директорию, если $_SERVER['DOCUMENT_ROOT'] недоступен или ненадёжен?

В качестве альтернативы можно использовать константы __DIR__ или __FILE__ с относительным путём от скрипта до корня. Например, если скрипт находится в /var/www/html/subdir/script.php, то корнем будет (уровень вложенности зависит от структуры).


<?php
// Если скрипт расположен на один уровень ниже корня
$root = dirname(__DIR__);
echo $root;
?>
  

Php file get html (получение html файла через php)

Этот подход требует знания иерархии каталогов проекта и не является универсальным.

Проблема:

При изменении структуры папок придётся обновлять число уровней. Решение - использовать конфигурационный файл, где явно задаётся путь к корню.

Как задать корневую директорию принудительно через конфигурацию проекта?

Многие фреймворки и приложения определяют константу ROOT_PATH в точке входа (например, index.php), используя __DIR__ и передавая её в автозагрузчик или другие части приложения.


<?php
define('ROOT_PATH', __DIR__ . '/../'); // если index.php в подпапке

echo ROOT_PATH;
?>
  

Root php (корневая директория сервера в php)

Такой подход даёт полный контроль над корнем независимо от настроек сервера.

Как получить корневую директорию через realpath и относительные пути?

Можно использовать realpath('./') для получения текущего рабочего каталога, но он не всегда совпадает с документ-рутом. Если скрипт вызывается из корня, результат будет верным.


<?php
$root = realpath('./');
echo $root;
?>
  

Include system php (включение системного файла)

Этот способ ненадёжен при смене текущей директории через chdir() или при запуске из другого места.

Ошибка:

Если скрипт запускается из консоли с другого каталога, realpath('./') укажет на каталог вызова, а не на корень веб-сервера. Рекомендуется не использовать этот метод в production.

Как использовать $_SERVER['CONTEXT_DOCUMENT_ROOT'] в Apache?

В Apache доступна переменная $_SERVER['CONTEXT_DOCUMENT_ROOT'], которая указывает на корень контекста (может отличаться от глобального DocumentRoot при использовании Alias или VirtualHost).


<?php
$root = $_SERVER['CONTEXT_DOCUMENT_ROOT'] ?? $_SERVER['DOCUMENT_ROOT'];
echo $root;
?>
  

Эта переменная полезна в сложных конфигурациях сервера, но доступна не во всех окружениях.

- Ru reading php line (чтение строки из файла php)
- Php path (пути в php)
- Start php include (подключение файлов)

Расширенные примеры работы с корневой директорией

Пример 1: Определение корня с помощью автозагрузчика и константы для всего проекта.

Пример

<?php
// в файле bootstrap.php
if (PHP_SAPI === 'cli') {
    // Для консоли можно установить корень вручную
    define('ROOT_PATH', realpath(__DIR__ . '/../'));
} else {
    define('ROOT_PATH', $_SERVER['DOCUMENT_ROOT']);
}

// Затем в любом скрипте:
echo ROOT_PATH;
?>
/var/www/myproject

Пояснение: проверка PHP_SAPI позволяет адаптироваться к окружению. В CLI константа задаётся относительно расположения bootstrap-файла.

Пример 2: Функция для безопасного получения корня с проверкой и нормализацией.

Пример

<?php
function getDocumentRoot(): string {
    if (!empty($_SERVER['DOCUMENT_ROOT'])) {
        $root = $_SERVER['DOCUMENT_ROOT'];
    } elseif (!empty($_SERVER['CONTEXT_DOCUMENT_ROOT'])) {
        $root = $_SERVER['CONTEXT_DOCUMENT_ROOT'];
    } else {
        // fallback на текущий каталог, если ничего не определено
        $root = __DIR__;
    }
    // Приводим к единому формату (убираем завершающий слэш)
    return rtrim(str_replace('\\', '/', $root), '/');
}

echo getDocumentRoot();
?>
/var/www/html

Функция объединяет несколько способов и гарантирует наличие хотя бы пути к исполняемому скрипту. Важно: такой fallback может не соответствовать фактическому корню веб-сервера, поэтому в production стоит явно задавать константу.

Пример 3: Использование $_SERVER['DOCUMENT_ROOT'] при работе с изображениями в общем файле (например, в шаблоне).

Пример

<?php
$root = $_SERVER['DOCUMENT_ROOT'];
$imagePath = $root . '/uploads/photo.jpg';

if (file_exists($imagePath)) {
    echo '<img src="/uploads/photo.jpg" alt="Фото">';
} else {
    echo 'Изображение не найдено';
}
?>

Результат: если файл существует, выводится тег с относительным URL. При этом путь на сервере строится через корневую директорию, а URL - через относительный от корня сайта.

Пример 4: Обход проблемы с DOCUMENT_ROOT при использовании встроенного сервера PHP (разработка).

Пример

<?php
// При запуске: php -S localhost:8000 -t public
echo "DOCUMENT_ROOT: " . ($_SERVER['DOCUMENT_ROOT'] ?? 'не задан');
echo "\n";
echo "Текущий каталог: " . __DIR__;
?>
DOCUMENT_ROOT: не задан
Текущий каталог: /home/user/project/public

Встроенный сервер PHP не устанавливает DOCUMENT_ROOT, поэтому для разработки лучше использовать __DIR__ или константу.

Пример 5: Настройка корня через файл конфигурации (например, .env).

Пример

<?php
// считываем переменную окружения, заданную в .env
$root = getenv('DOCUMENT_ROOT') ?: $_SERVER['DOCUMENT_ROOT'] ?? __DIR__;
echo $root;
?>
/var/www/app

Этот подход позволяет переопределять корень без правки кода - достаточно изменить DOCUMENT_ROOT в окружении.

Корневая директория сервера в PHP - comments

En
Root php (php)