Способы узнать текущую папку в 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";
?>