Ошибка Maximum execution time exceeded означает, что PHP-скрипт работал дольше разрешённого лимита (обычно 30-60 секунд) и был принудительно остановлен. Лимит задаётся директивой max_execution_time в настройках PHP. Просто поднять его - значит спрятать симптом: правильный путь - найти, на чём скрипт теряет время: медленный SQL-запрос, цикл по огромной выборке или ожидание внешнего сервиса. Разбираем, как вычислить узкое место и в каких случаях лимит всё же можно увеличить.

Где живёт лимит. Значение max_execution_time задаётся в php.ini, панели хостинга или настройках сайта; код может менять его функцией set_time_limit. У скриптов, запущенных из командной строки, лимита времени нет - это подсказка, куда уносить тяжёлые задачи.

Почему PHP не укладывается в лимит: типовые пожиратели времени

  • Медленные SQL-запросы - фильтр или поиск по каталогу без нужных индексов перебирает всю таблицу
  • Циклы по всей базе - пересчёт цен или остатков по 50 000 товаров за один заход
  • Внешние API - платёжка, служба доставки или курс валют отвечают по 20-30 секунд, скрипт послушно ждёт
  • Генерация файлов - выгрузки в Excel, карта сайта, нарезка картинок на лету
  • Агенты Битрикс на хитах - фоновые задачи платформы выполняются за счёт случайного посетителя

Как найти узкое место: пошаговый план

  1. Дочитайте ошибку до концаВ ней указаны файл и строка, где скрипт остановился. Это место, где время закончилось, - не всегда причина, но отправная точка.
  2. Включите лог медленных запросовSlow log в MySQL покажет, уходит ли время в базу. Один запрос на 40 секунд - и диагноз готов.
  3. Откройте монитор производительности БитриксШтатный инструмент платформы: топ страниц по времени с разбивкой на PHP и SQL. Запустите на сутки и снимите сливки.
  4. Проверьте внешние вызовыНайдите обращения к чужим API и убедитесь, что таймауты заданы явно: ждать ответа 5 секунд, а не вечность.
  5. Замерьте подозрительный участокЛогирование времени по шагам скрипта за один прогон сужает круг до конкретной функции.

Где обычно узкое место: карта симптомов

СимптомВероятное узкое место
Падает одна страница фильтра или поискаSQL без индексов, тяжёлая выборка
Падает импорт или выгрузкаОбъём данных: нужны порции и запуск по cron
Падают случайные страницы в часы пикПерегружен сервер или соседи по хостингу
Падает оформление заказаВнешние API платёжек и доставок без таймаутов
Падает всё подряд после обновленияКонфликт кода - смотрите разбор в статье про ошибку 500

Страница или импорт не укладываются в лимит?

Профилируем код, оптимизируем запросы и вынесем тяжёлые задачи в фон. С 2013 года, 450+ проектов на Битрикс - смета до начала работ.

Ускорить скрипт

Когда поднимать max_execution_time, а когда чинить код

Поднимать лимит уместно для редких админских операций: разовый импорт, миграция, генерация большого отчёта. Для страниц, которые открывают посетители, увеличение лимита - капитуляция: никто не ждёт полминуты, люди уходят к конкурентам раньше. Если сайт в целом отвечает медленно, начните с материала как ускорить сайт - там разобраны и серверная, и клиентская части.

Важно. Подняв лимит глобально, вы разрешаете любому кривому скрипту висеть минутами и занимать рабочие процессы PHP. Под наплывом посетителей свободные процессы закончатся, и ляжет весь сайт - уже не одна страница.
Правильный приём. Всё тяжёлое - в командную строку и cron: у консольных скриптов нет лимита времени, а посетители не платят за них ожиданием. Большие объёмы обрабатывайте порциями с сохранением позиции - тогда обрыв на середине не заставит начинать заново.

Профилактика: чтобы лимит больше не стрелял

Раз в квартал смотрите монитор производительности и лог медленных запросов: деградация накапливается незаметно, каталог и база растут. На абонентской поддержке мы делаем это регулярно и чиним медленные места до того, как они превратятся в ошибки на экране.

Частые вопросы про max_execution_time

Ошибка появляется при загрузке большого прайса. Что делать?
Загружать порциями: по 500-1000 позиций за шаг с сохранением позиции между шагами, либо запускать импорт по cron из командной строки, где лимита нет. Точечно поднять лимит для админской операции тоже допустимо.
Можно ли просто поставить max_execution_time равным 300?
Для отдельного админского скрипта - да. Глобально для всего сайта - плохая идея: медленные страницы начнут копиться и занимать процессы PHP, а под нагрузкой сайт ляжет целиком. Лимит - предохранитель, не выкручивайте его без причины.
Почему на старом хостинге работало, а на новом падает?
У нового хостинга другие настройки PHP и другая скорость дисков и базы. Сравните значения max_execution_time и memory_limit на старой и новой площадках и прогоните монитор производительности - разница будет видна в цифрах.
Это то же самое, что ошибка 504 Gateway Timeout?
Нет. 504 - таймаут веб-сервера или прокси, который не дождался ответа PHP; Maximum execution time - внутренний лимит самого PHP. Причина обычно общая - слишком медленный код, поэтому и лечение похожее: искать узкое место.

Вывод: ошибка про execution time - это секундомер, который честно говорит, что где-то в коде течёт время. Найти течь можно за вечер по логам и монитору производительности, а если хочется сразу к результату - закажите доработку сайта: продиагностируем бесплатно и назовём цену до старта.