#Что происходит и когда применима инструкция
PHP может прервать долгую обработку, когда выполнение скрипта достигает max_execution_time. Однако для веб-запросов существуют отдельные ограничения PHP-FPM, Nginx/Apache и сети. Поэтому увеличение max_execution_time не всегда исправляет HTTP 504: важно найти, какой именно механизм завершает запрос.
#Причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Срабатывает лимит времени PHPСрабатывает лимит времени PHP. В журнале Maximum execution time of … seconds exceeded. | В журнале Maximum execution time of … seconds exceeded. | Сократить обработку и при необходимости обоснованно изменить лимит. |
| Процесс принудительно завершает PHP-FPMПроцесс принудительно завершает PHP-FPM. В FPM журнале указано request_terminate_timeout и завершение worker. | В FPM журнале указано request_terminate_timeout и завершение worker. | Учитывать лимит пула отдельно. |
| Ответ обрывает обратный проксиОтвет обрывает обратный прокси. В браузере 504/502, в PHP может продолжаться работа или не быть записи max_execution_time. | В браузере 504/502, в PHP может продолжаться работа или не быть записи max_execution_time. | Проверить журнал прокси и соответствующий timeout. |
#Подробная пошаговая инструкция
- Зафиксируйте полный текст и времяОткройте журнал ошибок PHP и обратного прокси за время сбоя. Если PHP пишет Maximum execution time exceeded, запишите файл и строку; если браузер показывает 504, ищите соответствующую строку Nginx/Apache. Не меняйте тайм-ауты до определения первого ограничителя.
- Сравните время выполнения на маленьком и большом набореВ тестовой среде воспроизведите обработку 10 и 100 записей, замерьте длительность и рост памяти. Если объём растёт линейно, разбейте операцию на небольшие части; если время резко увеличивается, ищите тяжёлый запрос БД или блокировку.
- SSH, только значение CLI, которое может отличаться от FPMLinux · Терминал (Bash)КомандаSSH, только значение CLI, которое может отличаться от FPM. Для сайта проверяйте ini_get в защищённом веб-контексте.
php -r "echo ini_get("max_execution_time"), PHP_EOL;"
- Проверьте ограничения веб-контекстаНайдите max_execution_time через настройки сайта, request_terminate_timeout в pool.d и тайм-аут ожидания FastCGI в веб-сервере. На Linux время системных вызовов и ожидания внешних операций может не входить в max_execution_time так же, как собственное выполнение PHP; это зависит от платформы.
- SSH, администратор, только поиск ограничений в пулах Debian/UbuntuLinux · Терминал (Bash)КомандаНужен sudoSSH, администратор, только поиск ограничений в пулах Debian/Ubuntu. При иной сборке проверьте путь.
sudo grep -R -nE "^\s*(request_terminate_timeout|php_admin_value\[max_execution_time\])" /etc/php/*/fpm/pool.d/*.conf
- Сначала устраните дорогую операциюДля многотысячных записей используйте обработку порциями или очередь заданий; уменьшите объём выборки, добавьте индексы после проверки плана SQL, установите разумные тайм-ауты для обращений к API. Не запускайте тяжёлую задачу при каждом открытии страницы.
- Если синхронный запрос неизбежен, согласуйте границыНа ограниченном примере выберите max_execution_time с запасом, оцените ресурсы и согласуйте с тайм-аутами прокси и FPM. Не ставьте бесконечное время всем веб-запросам. Для фоновой задачи лучше отдельный CLI-исполнитель с контролем очереди и повторов.
- Измените настройку в правильном местеСохраните конфигурацию нужного пула, настройте лимит через панель или ini FPM, выполните тест и примените только выбранную службу. Повторите один безопасный запрос в тестовом окружении, затем на работающем сервере.
- SSH с административными правами, пример Debian + PHP 8.2Linux · Терминал (Bash)С осторожностьюНужен sudoSSH с административными правами, пример Debian + PHP 8.2. Проверка перед применением; reload может влиять на активные запросы.
sudo php-fpm8.2 -t && sudo systemctl reload php8.2-fpmКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Проверьте, что не появилось новых проблемСравните время ответа, RAM, количество активных обработчиков и очередь FPM. Если длинные запросы начали занимать все процессы, верните ограничение и вынесите операцию в фоновую обработку.
#Как проверить, что проблема исправлена
Задача завершается штатно без сообщения max_execution_time, HTTP-ответ получен в разумный срок и нет накопления занятых работников.
#Если не помогло — дальнейшая диагностика и откат
Если вместо ошибки PHP остаётся 504, читайте журнал прокси и время ответа приложения. Не увеличивайте тайм-ауты одновременно на всех уровнях без измерений.