PHP: Failed to open stream: Permission denied — что делать
Файл есть, но PHP не может его прочитать или записать: не хватает прав. PHP-FPM работает от своего пользователя, например www-data, и права смотрятся для него. Исправляют владельца или права нужной папки — не 777.
Содержание 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 21file_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.
Если всё верно, а ошибка осталась
- Проверьте, что смотрите на тот же сервер и ту же папку, что указаны в сообщении.
- На сервере может быть несколько пулов 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 | найдите её в списке |
Источники
- Исходный код PHP 8.3.6: streams.c — текст Failed to open stream и причина после двоеточия.
- Справка namei для Ubuntu 24.04 — ключ -l показывает права, владельца и группу каждой папки на пути к файлу.
- Справка chown для Ubuntu 24.04 — смена владельца и группы, ключ -R — для папки со всем содержимым.
Сверено 14 октября 2026 года.
Что почитать дальше
- Ошибки PHPкак читать сообщение и где журнал.
- Права на файлы сайта755, 644 и владелец по шагам.
- Права на файлычто значат r, w, x и числа.
- Команда chownкак сменить владельца файла.