PHP на сервере PHP 7.x/8.x на Linux; версия и веб-обработчик уточняются

PHP на сервере: PHP не может открыть файл по относительному пути

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

Относительный путь PHP может разрешаться не из каталога самого скрипта, а относительно текущего рабочего каталога процесса. Поэтому include("config.php") или file_get_contents("data/file.txt") иногда работает из CLI и ломается в веб-запросе либо после вызова chdir().

В этой статье
  1. Что происходит и как определить неисправность
  2. Вероятные причины и признаки
  3. Пошаговая диагностика и исправление
  4. Как проверить результат
  5. Если не помогло

#Что происходит и как определить неисправность

Относительный путь PHP может разрешаться не из каталога самого скрипта, а относительно текущего рабочего каталога процесса. Поэтому include("config.php") или file_get_contents("data/file.txt") иногда работает из CLI и ломается в веб-запросе либо после вызова chdir().

#Вероятные причины и признаки

Возможная причинаКак узнатьЧто делать
Непредсказуемый рабочий каталогНепредсказуемый рабочий каталог. getcwd() различается при запуске через cron и PHP-FPMgetcwd() различается при запуске через cron и PHP-FPMПривязать путь к __DIR__ файла, которому нужен ресурс.
Ресурс не существует по рассчитанному адресуРесурс не существует по рассчитанному адресу. Результат realpath() равен false, имя файла и регистр расходятсяРезультат realpath() равен false, имя файла и регистр расходятсяПроверить фактический абсолютный путь.
Процесс не может читать файлПроцесс не может читать файл. Файл есть, но в журнале Permission denied или open_basedir restrictionФайл есть, но в журнале Permission denied или open_basedir restrictionПроверить ограничения доступа, не открывая весь каталог миру.

#Пошаговая диагностика и исправление

  1. Выпишите точное имя отсутствующего файлаВ журнале PHP найдите failed to open stream, No such file or directory или open_basedir restriction. Запишите имя файла, вызвавшую строку и способ запуска (веб, cron, CLI). Под одинаковым текстом ошибки бывают разные причины.
  1. Проверьте расположение файлаВ панели управления файлами откройте корень сайта и нужную подпапку. Убедитесь в точном написании, регистре букв и расширении. Linux различает Config.php и config.php. Не переносите файл в общедоступный каталог ради устранения ошибки.
  1. Сравните каталог процесса с каталогом кодаНа тестовой копии добавьте в журнал getcwd() и __DIR__ в месте ошибки, без вывода служебных путей пользователю. Если они различны, относительный путь может оказаться привязан к другому месту.
  1. Соберите путь относительно текущего PHP-файлаВ редакторе кода на тестовой копии замените опасный относительный путь на __DIR__ . "/config.php". Если файл лежит выше, используйте dirname(__DIR__) и заранее проверьте конечный путь. Код ниже — иллюстрация для файла, расположенного рядом.
  2. Пример кода по теме
    PHP
    Пример фрагмента PHP для тестовой копии; не выполнять в оболочке и не размещать конфигурацию публично.
    <?php
    $path = __DIR__ . "/config.php";
    if (!is_file($path) || !is_readable($path)) {
        throw new RuntimeException("Configuration file is unavailable");
    }
    require $path;
  1. Проверьте контекст планировщикаЕсли ошибка появляется лишь по расписанию, в SSH посмотрите рабочий каталог задания и путь к интерпретатору в crontab/панели. Пропишите полный путь до PHP-скрипта, а все внутренние зависимости оставьте привязанными к __DIR__; не рассчитывайте на cd, случайно заданный пользователем.
  1. Исследуйте права и open_basedirЕсли файл существует, проверьте владельца/группу и право на проход по родительским каталогам для пользователя PHP-FPM. Ограничение open_basedir расширяйте только до необходимой директории и только с разрешения администратора. Не делайте chmod -R 777.
  1. Учтите относительные пути в подключаемых файлахПри require нескольких файлов __DIR__ в каждом из них указывает на каталог соответствующего файла; это полезно, но не заменяет проверки расположения ресурса. Для файлов загрузки и пользовательских имён проверьте нормализацию пути, чтобы избежать выхода за каталог.
  1. Проверьте два способа исполненияОткройте маршрут через HTTPS и повторите тот же сценарий из фонового обработчика на тестовом экземпляре. В обоих случаях файл должен быть доступен без изменения глобального рабочего каталога. При сбое восстановите прежний код и зафиксируйте вычисленный путь.

#Как проверить результат

На тестовом запросе и в планировщике отсутствует ошибка открытия файла, ресурс находится только в ожидаемом безопасном каталоге, а журнал не раскрывает служебные пути в HTML.

#Если не помогло

Если __DIR__ указывает верно, но ошибка остаётся, различайте отсутствие файла, права доступа и open_basedir: они требуют разных исправлений. Смена cwd на весь проект часто маскирует дефект.

Так эту ошибку тоже называют

Источники и обновления

Для этой статьи пока не указаны источники. Мы отмечаем такие материалы и дополняем их при проверке.

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.