Почему возникает ошибка Maximum execution time exceeded?
В 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') - никак не помогает.
В чем может быть причина остановки скрипта и появления данного лога? Где искать причину?
Дополнительно:
Где искать причину?
в коде
а по существу без дополнительных данных ничего сказать нельзя, это как "чему равен Х" без дополнительной информации
Обратился уже и в техподдержку VPS, на котором сам сайт, жду отклика от них...
Например, поставив лимит времени исполнения в 25 секунд, можно спокойно увидеть как скрипт отвалилися только на следующие сутки при запросе почты по pop3 :)
ini_set('max_execution_time', 120);
Ответы:
Нужно катать сферические шары в вакуме. Их 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 , но уж как есть
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Ошибка 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.