Как PHP возвращает путь к скрипту: полное руководство
Работа с путями в PHP: получение пути к файлу
Основной и наиболее надёжный способ получить полный путь к исполняемому файлу - использование магической константы __FILE__. Она возвращает абсолютный путь к файлу, в котором была вызвана, включая его имя.
echo __FILE__;Php получить путь (получить путь к файлу php)
Результат на сервере Linux: /var/www/html/index.php. На Windows: C:\xampp\htdocs\index.php.
Ошибки и нюансы: при подключении файлов через include или require константа __FILE__ всегда указывает на файл, в котором она написана, а не на вызывающий скрипт. Для пути к родительскому скрипту следует использовать $_SERVER['SCRIPT_FILENAME'] (только в веб-контексте). Также в Windows путь может содержать обратные слеши, что снижает кроссплатформенность.
Как получить директорию текущего файла?
Применение dirname(__FILE__) или, начиная с PHP 5.3, константы __DIR__. Обе конструкции возвращают путь к папке с файлом без имени самого файла.
echo dirname(__FILE__); // или __DIR__указать путь php (указать путь в php)
Результат: /var/www/html
Типичная ошибка: на Windows функция dirname может вернуть обратные слеши. Для унификации путей рекомендуется преобразовывать слеши: str_replace('\\', '/', __DIR__). Также при работе с симлинками __DIR__ возвращает путь файловой системы, а не веб-корня.
Как извлечь только имя файла из полного пути?
Функция basename() выделяет имя файла без директории. Вызов basename(__FILE__) вернёт index.php.
echo basename(__FILE__);
Результат: index.php
При завершающем слеше в аргументе поведение basename может быть неочевидным. В Windows функция корректно обрабатывает и прямые, и обратные слеши.
Как получить различные компоненты пути (расширение, имя без расширения)?
Функция pathinfo() возвращает ассоциативный массив с элементами: dirname, basename, extension (если есть) и filename. Можно запросить конкретную часть, указав второй параметр, например PATHINFO_EXTENSION.
print_r(pathinfo('/var/www/html/index.php'));
echo pathinfo('/var/www/html/index.php', PATHINFO_EXTENSION);
Результат: Array ( [dirname] => /var/www/html [basename] => index.php [extension] => php [filename] => index ) и php.
Для файлов без расширения или с несколькими точками (например archive.tar.gz) pathinfo выделяет только последнюю часть. Это стоит учитывать при разборе сложных имён.
Как получить реальный (канонический) путь, разрешив симлинки и относительные элементы?
Функция realpath() преобразует путь в абсолютный, удаляя символы ., .. и разрешая символические ссылки. Если файл не существует, возвращает false.
echo realpath('/var/www/../www/html/./index.php');
Результат: /var/www/html/index.php
Основная проблема: realpath требует существования файла. Для несуществующих путей результат будет false. Также функция зависит от прав доступа - при отсутствии прав на чтение каталогов может завершиться неудачей.
Как получить корень веб-сервера (document root)?
В веб-окружении глобальный массив $_SERVER содержит ключ DOCUMENT_ROOT, который указывает на корневую директорию сервера, заданную в конфигурации (например, /var/www/html).
echo $_SERVER['DOCUMENT_ROOT'];
Результат: /var/www/html
Значение доступно только при запуске через веб-сервер (Apache, Nginx). В командной строке переменная не определена. Также возможны расхождения, если используется виртуальный хост или псевдонимы (Alias).
Как получить путь к текущему скрипту из веб-запроса?
Переменная $_SERVER['SCRIPT_FILENAME'] содержит абсолютный путь к скрипту, который был непосредственно вызван через URL (после обработки rewrite правил). Это не всегда совпадает с __FILE__, если файл был включён.
echo $_SERVER['SCRIPT_FILENAME'];
Результат: /var/www/html/app.php
При использовании mod_rewrite значение может отличаться от реального пути скрипта. Кроме того, в CLI-режиме переменная может отсутствовать или содержать путь к файлу, переданному в аргументе.
Как получить текущую рабочую директорию?
Функция getcwd() возвращает путь к каталогу, в котором в данный момент работает скрипт. Этот путь может изменяться после вызова chdir().
echo getcwd();
Результат: /var/www/html
Если скрипт меняет директорию через chdir, последующие вызовы getcwd отразят новое местоположение. Не следует полагаться на getcwd для определения расположения самого скрипта.
Как правильно объединять части пути для кроссплатформенности?
Константа DIRECTORY_SEPARATOR содержит символ разделителя директорий, используемый в операционной системе (/ на Linux/macOS, \ на Windows). Её применение позволяет собирать пути, не зависящие от платформы.
$path = __DIR__ . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'settings.php';
echo $path;
Результат (Linux): /var/www/html/config/settings.php
Несмотря на константу, многие функции PHP принимают прямой слеш даже на Windows. Избыточное использование DIRECTORY_SEPARATOR может усложнить ручную проверку путей. В некоторых проектах предпочитают всегда использовать прямой слеш и заменять его при выводе.
Расширенные примеры работы с путями
Безопасное подключение файла из подключаемого модуля
Пусть имеется структура: app/modules/module_a/helper.php. Из helper.php требуется подключить файл config/db.php, расположенный на два уровня выше. Используем комбинацию __DIR__ и realpath.
// helper.php
$configPath = realpath(__DIR__ . '/../../config/db.php');
if ($configPath !== false) {
require $configPath;
} else {
echo 'Файл не найден';
}
Результат: если файл config/db.php существует, он будет подключён. realpath автоматически преобразует относительный путь в абсолютный и проверит существование.
Файл db.php подключён успешно (или 'Файл не найден')
Извлечение компонентов и сборка нового пути с помощью pathinfo
Требуется переименовать файл, добавив суффикс _backup перед расширением, сохранив директорию.
$original = '/var/www/uploads/photo.jpg';
$info = pathinfo($original);
$newName = $info['dirname'] . DIRECTORY_SEPARATOR . $info['filename'] . '_backup.' . $info['extension'];
echo $newName;
Результат:
/var/www/uploads/photo_backup.jpg
Сравнение __FILE__ и $_SERVER['SCRIPT_FILENAME'] при использовании mod_rewrite
Пусть запрос http://example.com/page через .htaccess направляется на router.php, который включает controllers/PageController.php. В PageController.php выведем обе константы.
// controllers/PageController.php
echo '__FILE__: ' . __FILE__ . PHP_EOL;
echo 'SCRIPT_FILENAME: ' . $_SERVER['SCRIPT_FILENAME'];
Результат при запросе http://example.com/page:
__FILE__: /var/www/html/controllers/PageController.php SCRIPT_FILENAME: /var/www/html/router.php
Различие наглядно: __FILE__ указывает на текущий включённый файл, а $_SERVER['SCRIPT_FILENAME'] - на первоначально вызванный скрипт.
Кроссплатформенная сборка пути с DIRECTORY_SEPARATOR
При создании пути к пользовательской директории внутри приложения удобно использовать константу разделителя, чтобы код работал на Windows и Linux без изменений.
$base = __DIR__;
$userDir = $base . DIRECTORY_SEPARATOR . 'users' . DIRECTORY_SEPARATOR . 'alice';
if (!is_dir($userDir)) {
mkdir($userDir, 0755, true);
echo 'Создана директория: ' . $userDir;
} else {
echo 'Директория уже существует: ' . $userDir;
}
Результат (Linux):
Создана директория: /var/www/html/users/alice
На Windows результат был бы: C:\xampp\htdocs\users\alice.
Использование getcwd() после смены рабочей директории
Иногда требуется временно перейти в другой каталог для работы с файлами, а затем вернуться обратно. Покажем, как меняется текущий путь.
echo 'Начальная директория: ' . getcwd() . PHP_EOL;
chdir('/tmp');
echo 'После смены: ' . getcwd() . PHP_EOL;
chdir(__DIR__);
echo 'Возвращены в исходную: ' . getcwd();
Результат:
Начальная директория: /var/www/html После смены: /tmp Возвращены в исходную: /var/www/html