Способы узнать текущую папку в PHP

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

Основные способы получения директории

В PHP работа с файловой системой часто требует точного определения пути к директории. Это необходимо для подключения файлов, создания каталогов, записи логов и многих других операций. Рассмотрим наиболее эффективные и часто используемые подходы.

Как получить путь к папке, в которой находится выполняемый скрипт?

Самый надёжный и производительный способ - использовать магическую константу __DIR__. Она возвращает абсолютный путь к директории текущего файла (без конечного слэша). Эта константа вычисляется на этапе компиляции, поэтому работает быстро и не зависит от рабочей директории.


<?php
// файл /var/www/site/includes/config.php
// __DIR__ вернёт /var/www/site/includes

require_once __DIR__ . '/../vendor/autoload.php'; // подключение автозагрузчика

$logPath = __DIR__ . '/../logs/app.log'; // построение пути к файлу лога
?>

Php site dir (директория сайта в php)

Типичная ошибка: использование __DIR__ в файлах, подключаемых через include из другой директории - константа всегда указывает на файл, где она записана. Это правильное поведение, но новички иногда ожидают, что __DIR__ будет равен getcwd().

Как получить текущую рабочую директорию (CWD) процесса PHP?

Функция getcwd() возвращает путь к директории, в которой сейчас выполняется скрипт (например, директория, из которой был вызван php-интерпретатор). Этот путь может отличаться от __DIR__, особенно при выполнении из командной строки или при изменении рабочей директории через chdir().


<?php
echo getcwd(); // /var/www/site/public
?>

Php dir name (имя директории в php)

/var/www/site/public

Dirs php id (каталоги по id в php)

Возможная проблема: если внутри скрипта вызван chdir(), getcwd() вернёт изменённый путь, что может привести к неожиданным результатам при подключении файлов.

Как получить родительскую директорию на один или несколько уровней вверх?

Функция dirname($path, $levels) позволяет подняться на заданное количество уровней. Второй аргумент доступен с PHP 7.0. Если его не указывать, по умолчанию $levels = 1.


<?php
$path = '/var/www/site/public/images/logo.png';
$parentDir = dirname($path, 2); // подняться на 2 уровня: images -> public

echo $parentDir;
?>

Php include dir (подключение директории в php)

/var/www/site/public

Php get dir (получение директории в php)

Ошибка при отрицательном $levels: если передать отрицательное число, функция вернёт пустую строку или сгенерирует предупреждение.

Как извлечь только имя папки (последний сегмент пути)?

Функция basename() возвращает последний элемент пути. Для получения имени директории (без имени файла) её можно комбинировать с dirname().


<?php
$path = '/var/www/site/public';
$folderName = basename($path); // 'public'

echo $folderName;
?>
public

Как разобрать полный путь на составляющие (директория, имя, расширение)?

Функция pathinfo($path, $options) возвращает ассоциативный массив или указанную часть пути. С её помощью можно получить директорию, имя файла, расширение.


<?php
$path = '/var/www/site/index.php';
$info = pathinfo($path);
echo $info['dirname']; // /var/www/site
echo $info['basename']; // index.php
?>

Как получить канонический абсолютный путь, разрешив симлинки и сокращения (..)?

Функция realpath($path) преобразует относительный путь в абсолютный, разрешая все символические ссылки и удаляя лишние '..' и '.'.


<?php
$relative = '/var/www/site/../public/./images/..';
$absolute = realpath($relative); // /var/www/site/public

echo $absolute;
?>
/var/www/site/public

Проблема: если путь не существует, realpath() возвращает false. Перед использованием стоит проверять результат на false.

Как получить корневую директорию веб-сервера (DocumentRoot)?

В веб-окружении часто используется суперглобальная переменная $_SERVER['DOCUMENT_ROOT']. Она содержит путь, указанный в конфигурации сервера как корень сайта.


<?php
$root = $_SERVER['DOCUMENT_ROOT']; // например, /var/www/html

require_once $root . '/includes/db.php';
?>

Недостаток: переменная доступна только при выполнении через веб-сервер (Apache, Nginx). В CLI-скриптах её может не быть или она будет задана неверно.

Как получить директорию из URL или пользовательского ввода (без файла)?

Если нужно извлечь часть URL до последнего слэша, используется dirname() (даже для URL), либо parse_url() с компонентом path.


<?php
$url = 'https://example.com/images/photo.jpg';
$dir = dirname($url); // https://example.com/images

$parsed = parse_url($url, PHP_URL_PATH); // /images/photo.jpg
$dir2 = dirname($parsed); // /images
?>

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

Рекурсивное получение родительской директории на N уровней вверх

Функция dirname() с уровнем может поднять только на фиксированное число шагов. Если требуется подниматься до определённого корневого каталога, используется цикл.

Пример

<?php
function goUpUntil($startPath, $targetDirName) {
    $current = $startPath;
    while (true) {
        if (basename($current) === $targetDirName) {
            return $current;
        }
        $parent = dirname($current);
        if ($parent === $current) { // дошли до корня
            return false;
        }
        $current = $parent;
    }
}

$path = '/var/www/site/public/uploads/2025';
$projectRoot = goUpUntil($path, 'site'); // /var/www/site

echo $projectRoot;
?>
/var/www/site

Комбинирование __DIR__ и dirname() для гибкого построения путей

Часто требуется подключить файл из соседней директории. Использование __DIR__ даёт точку отсчёта, а dirname() поднимает на уровень вверх.

Пример

<?php
// файл: /var/www/site/app/Controllers/UserController.php

// подключаем модель из /var/www/site/app/Models/
require_once dirname(__DIR__) . '/Models/User.php';

// подключаем конфиг из /var/www/site/config/
$configPath = dirname(__DIR__, 2) . '/config/app.php';
require_once $configPath;
?>

Использование realpath() с проверкой существования

realpath() возвращает false, если путь не существует. В production-коде необходима проверка.

Пример

<?php
$relativePath = '/var/www/site/public/../config/database.php';
$absPath = realpath($relativePath);

if ($absPath === false) {
    // Обработка ошибки: путь не найден
    error_log("Файл конфигурации не найден: $relativePath");
    exit(1);
}

echo "Абсолютный путь: $absPath";
?>
Абсолютный путь: /var/www/site/config/database.php

Получение списка PHP-файлов в текущей директории скрипта

Сочетание __DIR__ с glob() позволяет перечислить файлы по маске.

Пример

<?php
$dir = __DIR__;
$phpFiles = glob($dir . '/*.php');

foreach ($phpFiles as $file) {
    echo pathinfo($file, PATHINFO_FILENAME) . "<br>";
}
?>
index
config
functions

Изменение рабочей директории и получение обновлённого CWD

Функция chdir() меняет текущую директорию процесса. После её вызова getcwd() возвращает новый путь.

Пример

<?php
$original = getcwd();
chdir('/tmp');
$changed = getcwd(); // /tmp

echo "Было: $original, Стало: $changed";

// Вернуться обратно
chdir($original);
?>
Было: /var/www/site/public, Стало: /tmp

Использование SplFileInfo для получения директории файла

Объектно-ориентированный подход - класс SplFileInfo содержит методы getPath() и getPathname().

Пример

<?php
$file = new SplFileInfo('/var/www/site/public/index.php');
$dir = $file->getPath(); // /var/www/site/public
$fullDir = $file->getPathname(); // полный путь с именем файла

echo $dir;
?>
/var/www/site/public

Безопасное получение директории из пользовательского ввода (защита от path traversal)

При обработке путей, полученных от пользователя (например, через GET-параметр), следует использовать realpath() и проверять, что результат начинается с разрешённой базовой директории.

Пример

<?php
$baseDir = '/var/www/site/secure/'; // разрешённая папка
$userPath = $_GET['path'] ?? ''; // например, '../../etc/passwd'

$fullPath = realpath($baseDir . $userPath);

if ($fullPath === false || strpos($fullPath, $baseDir) !== 0) {
    // Некорректный или опасный путь
    echo "Доступ запрещён";
    exit;
}

echo "Корректный путь: $fullPath";
?>

Получение директории в PHP - comments

En
Php get dir (php)