#Симптом и границы применимости
PHP-скрипт может исправно выполняться из командной строки, но давать ошибку при HTTP-запросе, поскольку CLI и FPM различаются пользователем, рабочим каталогом, переменными окружения, временем выполнения и доступными расширениями. Решать проблему повышением всех прав и отключением ограничений нельзя.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет доступа к файлу или каталогуCLI запускают от владельца, FPM — от отдельного пользователя. | В журнале PHP Permission denied | Сравнить пользователей, каталоги и ACL |
| Отличается рабочий каталог или окружениеPHP CLI и FPM могут иметь разные getcwd и окружение. | В PHP файлы через относительный путь не находятся | Использовать __DIR__ и явные пути |
| Расходятся конфигурация и расширенияВерсия веб-SAPI может быть другой. | Undefined function/Class not found только через веб | Сравнить PHP_VERSION, ini и loaded extensions |
#Пошаговая диагностика и исправление
- Определите безопасный точный примерВыберите действие, которое не приводит к оплате, отправке писем или изменению производственных данных. Зафиксируйте ошибку CLI и HTTP-запроса на одной копии кода и одинаковых тестовых данных. В браузере F12 → «Сеть» запишите код ответа, время и URL без персональных параметров.
- Найдите ошибку из веб-журналаВ SSH посмотрите журнал конкретного пула PHP-FPM и ErrorLog веб-сервера в момент HTTP-запроса. Если продакшен скрывает stack trace (правильно), не включайте display_errors публично — пользуйтесь закрытым error_log.
- Имя службы замените на установленноеLinux · Терминал (Bash)КомандаНужен sudoИмя службы замените на установленное. Стек и пути файлов могут быть конфиденциальны.
sudo journalctl -u php8.2-fpm -n 80 --no-pager
- Сравните PHP-параметры двух средВ терминале запустите php -v и php --ini от того же пользователя, что и рабочее CLI-задание. В закрытом тестовом веб-запросе посмотрите PHP_VERSION, php_ini_loaded_file(), getcwd(), __DIR__, extension_loaded(). После теста удалите диагностический файл.
- Дополнительная команда по темеLinux · Терминал (Bash)Команда
php -v; php --ini
- Проверьте фактические файловые праваПо тексту ошибки найдите точный файл и путь. В SSH запустите namei -l и ls -l, затем определите пользователя пула из конфигурации FPM. Разрешение может отсутствовать на родительском каталоге. Не делайте глобальный chmod или chown для исправления одного пути.Linux · Терминал (Bash)КомандаПуть замените на свой, команда только читает права.
namei -l /var/www/example.com/private/file.dat
- Исправьте код или изолированную настройкуДля путей к файлам используйте __DIR__ и заранее заданные каталоги, не полагайтесь на текущую директорию. Для нужного расширения установите модуль в версию FPM и убедитесь, что его загрузка разрешена. Для внешних переменных окружения используйте безопасный механизм конфигурации приложения, учитывая clear_env пула.
- Повторно проверьте обе средыПосле резервной копии и минимального изменения запустите тот же безопасный сценарий через CLI и HTTP. Сверьте коды, файлы результата и журнал, проверьте работу соседних сайтов. Если правка повысила доступ к приватным файлам без необходимости, немедленно откатите её.
#Как проверить результат
Один и тот же безопасный сценарий отрабатывает через CLI и HTTP, журнал FPM не показывает ошибок, необходимые файлы доступны только правильному пользователю.
#Если проблема не устранена
Если команды одинаковы, а результат отличается, сравните версию, SAPI, переменные, текущую папку, ограничения open_basedir и компоненты PHP; ищите минимально необходимое изменение.