Почему возникает ошибка Maximum execution time exceeded?

Ссылка скопирована
PHP
1 ответ

В php логах сайта имеется строка PHP Fatal error: Maximum execution time of 120 seconds exceeded
Минут через 10-15 работы останавливается скрипт (но никак не через 120 секунд, как указано в логах). При этом, в php.ini менял значение max_execution_time на 86400 секунд, также в самом php-скрипте в начале указано ini_set('max_execution_time', '86400') - никак не помогает.
В чем может быть причина остановки скрипта и появления данного лога? Где искать причину?

Дополнительно:

Где искать причину?

в коде

а по существу без дополнительных данных ничего сказать нельзя, это как "чему равен Х" без дополнительной информации

  • Скорее всего ваши настройки не применяются, ошибка верная, скорее всего в коде какое то тяжёлое действие в цикле
  • Дмитрий, да, это парсер и в нем есть цикл, в котором обрабатывается (парсится) 1692 товара. Но почему появляется ошибка с таймаутом в 120 секунд? Вот это непонятно.
    Обратился уже и в техподдержку VPS, на котором сам сайт, жду отклика от них...
  • Konyuh, появляется она раньше,просто цикл уже в процессе
  • Konyuh, в PHP time limit не учитывает время ожидания сетевых запросов.
    Например, поставив лимит времени исполнения в 25 секунд, можно спокойно увидеть как скрипт отвалилися только на следующие сутки при запросе почты по pop3 :)
  • Может, в коде где-то затесалось что-то подобное?

    ini_set('max_execution_time', 120);

  • Виктор Кожухарь, в том то и дело, что абсолютно нигде такого нету. И в php.ini задержек в 120 секунд тоже нет...
  • Konyuh, Хостер может игнорировать все ваши настройки
  • Виктор Кожухарь, все верно - ответила техподдержка хостинга и выяснилось, что max_execution_time в 120 секунд было задано в fastpanel, которая установлена на сайте. Поменял на 86400 сек., теперь работает как надо)
  • Ответы:

    Нужно катать сферические шары в вакуме. Их 1000 штук. Работник каждые 30 секунд уходит покурить.
    Один шар он перекатывает за время от 1 до 3х секунд (то есть нет равномерности).

    Запрещаем ему курить пока не перекатит все. А он сволочь такая лажает постоянно.
    Решение
    Вместо цикла
    для всех шаров с 1 по 1000 делай катать
    пишем
    Напиши на доске номер шара - 1
    Цикл
    прочитай номер шара
    засеки время
    откати шар
    он 1000 - й , то ты свободен
    посмотри время
    если прошло больше 25 секунд, то запиши номер следующего шара и иди курить

    • Вы под чем вообще?
    • вместо того чтобы крутить цикл по всем за один проход,
      задачу нужно решить через последовательные запуски (запоминая номер итерации или реализовать очередь заданий)
    • Олег, понял. Ну это вариант с переработкой всего проекта в корень, нужно устранить баг что есть. Может, в том же php.ini есть настройка еще других таймаутов? Хотя посмотрю, что еще техподдержка хостинга ответит..
    • Konyuh, переделка в 5 строк.
      любой цикл от и до элементарно переделывается в
      получи начальное значение (вместо жесткой единицы)
    • Олег, а вот это уже интересно...
      Не могли бы Вы просто скинуть ссылку на обычный гайд по консолям или очередям, или о чем там речь в том примере про шары? Как нужно это все переделать и на какую это тему вообще?)
    • Konyuh, я не люблю граберов . Просто ваш кривой скрипт создавал лишнюю нагрузку из за запусков ещё и повторно после ошибок.

    Потому что долгоиграющие задачи надо выполнять не через браузер, а в консоли.
    Либо ручками, либо по крону (ну или через очереди, но этот вариант явно не соответствует уровню вопроса).

    • Это сайт облачный онлайн парсер интернет-магазинов для всех желающих, какая консоль?
    • Обычная. С фоновыми задачами

    зависит от среды в которой выполняется скрипт, если это какой-нибудь ВХ, то он вполне может переопределять ваши настройки - проверить можно банальным phpinfo()
    что же до самой задачи, то проще разбить её на шаги и создать long controller: допустим нужно спарсить 10к страниц - отправляем запрос к LongController::startAction() который записывает данные в очередь/базу, далее ajax'ом вызываем LongController::stepAction() который выполняет столько шагов сколько успеет (допустим за минуту - значение берется из расчета max_execution_time / 2) и так до тех пор пока метод не вернет сообщение что задача завершена. Пример реализации для Yii2

    Минут через 10-15 работы останавливается скрипт (но никак не через 120 секунд, как указано в логах)

    Посмотрите примечание в мануале, там всё описано. Несколько неудобно, что это примечание не продублировано в описании max_execution_time , но уж как есть

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Виктор Sys Ответ

    Ошибка Maximum execution time exceeded возникает, когда скрипт PHP выполняется слишком долго и превышает время выполнения, установленное в php.ini или веб-сервере.

    Существует несколько причин, по которым может возникнуть данная ошибка:

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

    2. Неправильная оптимизация: некоторые запросы или операции могут быть неоптимальными и требовать слишком много времени на выполнение.

    3. Большой объем данных: обработка большого объема данных может занять слишком много времени и привести к ошибке Maximum execution time exceeded.

    4. Неправильные настройки сервера: если сервер настроен неправильно, установленное время выполнения может быть слишком коротким для выполнения скриптов.

    Для исправления данной ошибки можно попробовать следующие способы:

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

    2. Увеличить время выполнения: вы можете увеличить максимальное время выполнения скрипта в файле php.ini, установив новое значение для директивы max_execution_time.

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

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

    Надеюсь, эти советы помогут вам исправить ошибку Maximum execution time exceeded и успешно выполнить ваш скрипт PHP.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно