Как лучше реализовать парсинг и трансляцию большого кол-ва RSS средствами PHP?

Требуется транслировать большое кол-во RSS лент (Около 5к) в несколько социальных сетей.

PHP-скрипт выполняется не более 30 секунд. Запускается по крону.
Одного запуска не хватит для обработки всех лент.

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

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

Подскажите, как такую задачу решают?
  • Вопрос задан
  • 3332 просмотра
Решения вопроса 3
Melkij
@Melkij
PostgreSQL DBA
Ну, например:
ставим сервер очередей
По крону или ещё как ставятся задачи на обход определённых адресов в очередь.
Воркеры разбирают задачи из очереди краулера, стучатся по адресу, разбирают результат.

Или вешаем 2 очереди:
в первую идут задачи краулеру, который работает только с сетью, а полученные документы кладёт во вторую очередь.
Другие воркеры разбирают вторую очередь и обрабатывают ленты.
В этом случае краулер можно сделать на мультикурле, эффективнее получится утилизировать ресурсы, вместо ожидания сети.

Но если у вас проблема всего-лишь с time limit'ом?...
Ответ написан
Комментировать
Считаем, что доступное время не изменить.

Тогда вам и очереди не особо помогут. Разве по 1му запросу на каждые 30сек запуска. И то сервер может не ответить сразу, или данные будете долго обрабатывать. А это большой % потери данных и оборванных заданий.

А вообще, идеальный вариант состоит из обоих ответов выше. Убрать лимит на кроны и ставить все в очередь.
Ответ написан
Комментировать
@impass
PHP скрипт выполняется не более 30 секунд. Запускается по крону.

Так у вас периодические задания реализованы как положено через crontab или как очередной костыль, вызываемый запросом к веб-серверу?
Как минимум в Debian/Ubuntu использование PHP интерпретатора (из штатных пакетов) через CLI предполагает конфигурацию, в которой max_execution_time = 0.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

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

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