#Что означает ошибка
Maximum execution time exceeded
«Fatal error: Maximum execution time of 30 seconds exceeded» означает, что PHP-скрипт работал дольше лимита max_execution_time. Чаще всего виноваты медленный запрос к базе, внешний API без таймаута, бесконечный цикл или обработка большого объёма данных.
Повышать лимит — временное решение; сначала найдите причину.
Для веб-запросов лимит защищает сервер.
Скрипт работает дольше max_execution_time. Увеличьте лимит или переведите задачу в фон.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Малый лимитmax_execution_time. | Ошибка. | Увеличьте. |
| Долгий скриптОперация. | Тяжёлая. | В фон. |
| Медленный запросБД. | Долго. | Индекс. |
| Внешние запросыAPI. | Таймаут. | Лимит. |
#Пошаговое решение
- Найдите медленное местоПрочитайте журнал ошибок PHP-FPM или Apache и найдите файл, строку и тип операции, где достигнут
Maximum execution time. Если используется PHP-FPM, администратор может включитьrequest_slowlog_timeoutиslowlogдля конкретного пула на время диагностики; сначала сохраните конфигурацию. Если проблема возникает на одном запросе к базе или внешнему API, анализируйте его отдельно. - Поднимите
max_execution_timeПроверьте действующийmax_execution_timeдля веб-сайта через панель хостинга или закрытую страницу сini_get("max_execution_time");php -iв CLI может показывать другое значение. Увеличивайте лимит только после выяснения, почему запрос медленный, и ненадолго в конкретном пуле/сайте, а не глобально. После изменения перезагрузите нужный PHP-FPM в согласованное окно и проверьте новую величину. - Увеличьте таймауты веб-сервераСопоставьте таймаут PHP с Nginx
fastcgi_read_timeoutили ApacheProxyTimeout, а также сrequest_terminate_timeoutPHP-FPM. Это разные ограничения: увеличение одного не отменяет другие. Не ставьте бесконечные таймауты; предварительно проверьте медленные SQL-запросы, блокировки, очереди и занятость воркеров. Перед изменением Nginx выполнитеnginx -t. - Добавьте таймауты в API-запросыЕсли выполнение ждёт удалённый API, в PHP-коде найдите вызовы cURL или HTTP-клиента и установите разумные таймауты соединения и общего выполнения. Например, для cURL это
CURLOPT_CONNECTTIMEOUTиCURLOPT_TIMEOUT, с обработкойcurl_errno(). Не увеличивайте ожидание без ограничения: недоступный сервис иначе удерживает рабочие процессы PHP. - Перенесите тяжёлую задачу в cronДля импорта больших файлов, генерации отчётов и пакетной обработки предложите разработчику перенести работу в фоновую очередь или задачу cron с сохранением прогресса и повторным запуском только недоделанных элементов. Сначала проверьте идемпотентность операции, затем протестируйте на небольшой порции; успешная проверка — отсутствие прежней ошибки без роста числа зависших процессов PHP-FPM.
#Как поднять лимит
В php.ini: max_execution_time = 120 (путь: php --ini). Для PHP-FPM перезапустите службу (systemctl restart php8.2-fpm). В скрипте: set_time_limit(300); или ini_set('max_execution_time', '300');. На хостинге лимит может задаваться в панели или .htaccess: php_value max_execution_time 120. Для CLI-скриптов лимит по умолчанию 0 (без ограничения).
#Если лимит не помогает
Для nginx увеличьте fastcgi_read_timeout 300;, иначе получите 504. Для Apache проверьте Timeout. В облачных хостингах лимит может быть жёстким и не меняться. Тогда вынесите обработку в очередь или cron-задачу.
#Поиск причины
Включите логирование медленных запросов (slow log PHP-FPM, slow_query_log MySQL). Профилируйте код с помощью или . Добавьте таймауты к curl (CURLOPT_TIMEOUT) и ограничьте выборки LIMIT. Обрабатывайте большие данные порциями.
php --iniphp -i | grep max_execution_time# Это значения CLI; действующий PHP-FPM и сайт могут использовать иной php.ini.#Как проверить результат
После изменения лимита убедитесь, что настройка применилась: создайте файл с <?php phpinfo(); и найдите max_execution_time (удалите файл после проверки). Для CLI-проверки выполните php -r "echo ini_get('max_execution_time');". Отметьте, что в PHP время ожидания ответа внешних сервисов или запросов к БД не всегда учитывается в лимите на Linux, а sleep() не считается — поэтому реальное время ожидания может быть больше. Если скрипт всё равно падает, смотрите журнал ошибок PHP.