#Что происходит и когда применима инструкция
При попытке записать файл PHP может получить Permission denied или No such file or directory. Причина бывает в владельце папки, правах всех родительских каталогов, неверном относительном пути, запрещённой области open_basedir, SELinux/AppArmor, переполнении диска или read-only mount.
#Причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Пользователь FPM не имеет права на записьПользователь FPM не имеет права на запись. Журнал показывает Permission denied, путь существует. | Журнал показывает Permission denied, путь существует. | Проверить UID процесса, владельца и ACL каталога. |
| Путь не существует либо неверенПуть не существует либо неверен. No such file or directory, относительный путь зависит от рабочего каталога. | No such file or directory, относительный путь зависит от рабочего каталога. | Создать разрешённую папку штатным способом и использовать абсолютный путь. |
| Ограничение системы или приложенияОграничение системы или приложения. Права Unix допустимы, но open_basedir, MAC или read-only ФС блокируют запись. | Права Unix допустимы, но open_basedir, MAC или read-only ФС блокируют запись. | Проверить конкретное ограничение без общего отключения защиты. |
#Подробная пошаговая инструкция
- Найдите точный путь и характер ошибкиВ журнале PHP прочитайте имя файла и errno/предупреждение; убедитесь, что запись выполняется из того же запроса и окружения. Не копируйте путь с секретными именами клиентов в публичный отчёт. Отдельно проверьте наличие свободного места на нужном разделе.
- SSH, только чтение, замените пример каталога проектаLinux · Терминал (Bash)КомандаSSH, только чтение, замените пример каталога проекта. df -h проверяет свободные байты, df -i — inode; обе причины могут остановить запись.
df -h /var/www/example; df -i /var/www/example
- Уточните пользователя, под которым работает PHPСверьте user/group в реальном pool.d с владельцем каталога. Не принимайте пользователя вашего SSH-сеанса за пользователя веб-процесса. При Apache mod_php или контейнере место настройки другое.
- SSH, только чтениеLinux · Терминал (Bash)КомандаSSH, только чтение. Найдите дочерние процессы pool имя, а не только основной процесс master.
ps -eo user,group,pid,args | grep -E "[p]hp-fpm|[p]hp.*fpm"
- Проверьте права на всю цепочку каталоговИспользуйте namei -l и getfacl при наличии. Пользователю нужен проход (x) по родительским папкам и запись в целевую. Если файл уже существует, нужны права на сам файл; создание нового файла зависит от прав папки. Не назначайте chmod -R 777.Linux · Терминал (Bash)КомандаSSH, только чтение прав. Путь замените реальным. namei показывает родительские каталоги, включая пропущенные при простой проверке ls.
namei -l /var/www/example/storage/cache/data.json; ls -ld /var/www/example/storage/cache
- Проверьте ограничения вне стандартных правПосмотрите open_basedir в настройках веб-FPM, наличие SELinux/AppArmor в журнале отказов, монтирование только для чтения и возможные квоты пользователя. Если есть deny, исправляйте разрешённую политику для нужной папки вместо глобального отключения механизма безопасности.
- Сделайте минимальное разрешение именно на каталог данныхСохраните настройки и, если необходимо, назначьте подходящую группу или ACL на конкретную папку storage/uploads. Код приложения не должен быть доступен для записи без причины; файлы конфигурации с паролями оставьте недоступными веб-пользователю на запись. При панели хостинга используйте её механизм владельца сайта.
- Проверьте запись безопасным пробным действиемЧерез штатный интерфейс приложения создайте тестовый документ/кэш, затем удалите его. Если тестируете через CLI, запустите от пользователя FPM в контролируемом каталоге и не допускайте создания файлов под root, которые затем заблокируют веб-процесс.
- Проверьте права после успешного тестаОткройте созданный файл на сервере: владельцем должен быть ожидаемый пользователь или группа, а разрешения — минимальные. Если ошибка повторяется после перезапуска/развёртывания, проверьте, не пересоздаёт ли система каталог с другим владельцем.
#Как проверить, что проблема исправлена
Штатная операция записи выполняется без Permission denied, нет новых ошибок, каталог исходного кода не получил лишние права.
#Если не помогло — дальнейшая диагностика и откат
Если доступ разрешён, но ошибка остаётся, смотрите реальный путь из сообщения PHP, open_basedir и ограничения контейнера. Не меняйте владельца всей /var/www рекурсивно.