denis_druid
@denis_druid

Почему «тяжелый скрипт» выполняется через раз?

Здравствуйте. Помогите решить вот что:
Есть скрипт парсера, собирает и прогоняет через различные фильтра очень много текста, потом всё это дело льет в БД, старые данные из БД чистит и всё в таком духе.
Выполняется примерно 5 минут.
Проблема в том, что каждый второй или третий раз он обрабатывает только половину данных.
Пример:
1-ый запуск: добавлено 310 записей
2-ой запуск: добавлено 108 записей
3-ий запуск: добавлено 311 записей
4-ый запуск: добавлено 327 записей
5-ый запуск: добавлено 113 записей
6-ой запуск: добавлено 324 записей
и тд.
300+ записей это норма, столько и должно быть. Но каждый раз, когда он "не дорабатывает", то записей всегда получается примерно 100 (106, 104, 108 и тд.).
Сначала я грешил на cron, что где-то там затык происходит, сутки его ковырял. Но пару раз сегодня такое наблюдал и при запуске скрипта вручную через браузер. Ощущение, что где-то забивается какой-то кэш, а потом обнуляется спустя некоторое время. Но возможно что-то еще.
Куда копать?
  • Вопрос задан
  • 207 просмотров
Решения вопроса 1
denis_druid
@denis_druid Автор вопроса
Итак, проблема решилась следующим образом:
Как я писал выше в комментах, недоработка скрипта происходит только в определенные часы по утрам. Скорее всего удаленный сервер, с которого идет парсинг, в это время загружается служебными задачами, что увеличивает время отклика.
В логах моего сервера никаких ошибок не было. Видимо, не отвечал как надо именно удаленный сервер.
Решение пришло после изменений в этой строке:
curl_setopt($ch, CURLOPT_TIMEOUT, 60); // изначало было 10, потом 30 (30 сек тоже не хватило)

с 60 секундами проблема ушла совсем.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Ahen
@Ahen
Универсальный дилетант
Смотреть логи, график сервера по памяти.
Но обычно все дело в лимите времени работы скрипта (опять-же в логах должна быть соответствующая ошибка, навроде The process *** exceeded the timeout of 60 seconds), лимит устанавливается чтобы зависшие скрипты убивались автоматом. Решается в php.ini, пункт max_execution_time в секундах.
Ответ написан
@Wexter
1) не хватило памяти, смотрите логи
2) не хватило времени, опять же смотрите логи
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы