Ошибки

PHP: Failed to open stream: Permission denied — что делать

Файл есть, но PHP не может его прочитать или записать: не хватает прав. PHP-FPM работает от своего пользователя, например www-data, и права смотрятся для него. Исправляют владельца или права нужной папки — не 777.

≈ 5 мин чтения3 шага
Содержание 10

Как выглядит ошибка

PHP Warning:  file_put_contents(/var/www/example.com/cache/data.json): Failed to open stream: Permission denied in /var/www/example.com/save.php on line 21
  • file_put_contents(…) — что PHP пытался сделать и с каким файлом. Вместо file_put_contents может быть fopen, include, require, mkdir.
  • Permission denied — файл или папка есть, но прав не хватает.
  • in /var/www/example.com/save.php on line 21 — где в коде это случилось.

На сайте под nginx запись лежит в журнале nginx: sudo tail -n 30 /var/log/nginx/error.log. Если файла нет совсем, PHP пишет No such file or directory — другой разбор.

Почему так

PHP-FPM, который выполняет скрипты для nginx, работает от своего пользователя. Права на файл Linux проверяет для этого пользователя, а не для вас. Если файлы сайта принадлежат вам, а права для остальных — только чтение, PHP прочитает их, но записать ничего не сможет.

  • Чтобы прочитать файл, нужно право r на файл и право x на каждую папку на пути к нему.
  • Чтобы записать в существующий файл — право w на него.
  • Чтобы создать новый файл — права w и x на папку, где он появится.

Шаг 1. Узнайте, от кого работает PHP

Команды вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне.

ps -eo user,comm | grep php-fpm

Команда покажет несколько строк, в первой колонке — имя пользователя. Строка с root — главный процесс PHP, он только раздаёт работу. Нужно имя из остальных строк: от него PHP читает и пишет файлы сайта, например www-data.

Шаг 2. Посмотрите права на пути

Подставьте путь из сообщения:

sudo namei -l /var/www/example.com/cache/data.json

Команда выведет каждую папку пути и сам файл — с правами, владельцем и группой. Как читать ответ, рассказано в разборе 403 Forbidden. Если файла ещё нет, подставьте путь к папке, где он должен появиться.

Шаг 3. Дайте PHP права на запись

Отдайте пользователю PHP только ту папку, куда сайт должен писать: кэш, загрузки, временные файлы. Вместо www-data подставьте имя из шага 1, вместо пути — свою папку:

sudo chown -R www-data:www-data /var/www/example.com/cache

Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter. Обновите страницу.

Для WordPress PHP нужна запись во всю папку сайта: так он сам загружает картинки, ставит плагины и обновляется. Как это сделать — Права на файлы сайта.

Если PHP не может прочитать файл

Если ошибка в include или require или при чтении файла, проверьте, что у файлов права 644, а у папок 755: тогда читать их может любой пользователь, в том числе PHP. Команды — Поставьте папкам 755, файлам 644.

Не ставьте права 777, чтобы ошибка ушла: так файл сможет поменять любой пользователь и любая программа на сервере.

Если всё верно, а ошибка осталась

  • Проверьте, что смотрите на тот же сервер и ту же папку, что указаны в сообщении.
  • На сервере может быть несколько пулов PHP-FPM с разными пользователями. Пользователь пула задан строкой user в его файле в папке /etc/php/8.3/fpm/pool.d/.
  • Если в сообщении путь в /tmp или в другой системной папке — передайте сообщение разработчику программы.

Команды — для PHP 8.3 из Ubuntu 24.04. В Ubuntu 26.04 стоит PHP 8.5: в путях и командах вместо 8.3 пишите 8.5. Какая версия у вас, покажет ls /etc/php/.

Ошибки рядом

Что видитеЧто делать
Failed to open stream: No such file or directoryфайла нет по этому пути
403 Forbidden на всём сайтеnginx не может прочитать файлы
Permission denied в терминале, а не в журнале PHPразбор для команд Linux
другая ошибка PHPнайдите её в списке

Источники

Сверено 14 октября 2026 года.

Что почитать дальше