Обработка нескольких RSS-каналов в PHP - PullRequest
2 голосов
/ 04 августа 2011

У меня есть таблица из более чем 15000 фидов, и ожидается, что она будет расти. Я пытаюсь получить новые статьи, используя simplepie, синхронно и сохранить их в БД.

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

Что я хочу знать, так это то, есть ли способ улучшить этот процесс. Может быть, загрузка каналов параллельно. Или, может быть, кто-то может сказать мне алгоритм псевдо для этого.

Ответы [ 3 ]

0 голосов
/ 04 августа 2011

получать новые статьи, используя simplepie, синхронно

Что вы подразумеваете под "синхронно"?Вы имеете в виду последовательно в том же процессе?Если это так, то это очень глупый подход.

Вам нужен способ разделения данных для выполнения в нескольких процессах.Делать это декларативно на основе, скажем, модуля идентификатора канала или хэша URL-адреса - не очень хорошее решение - один медленный URL-адрес приведет к задержке нескольких каналов.

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

  1. блокирует список фидов URL
  2. идентифицирует фид с самой старой датой истечения в прошлом, которая не помечена как зарезервированная
  3. пометить эту запись как зарезервированную
  4. разблокировать список каналов URL
  5. извлечь канал и сохранить его
  6. удалить зарезервированный флаг в списке для этого канала и обновитьвремя истечения срока действия

Обратите внимание, что если на шаге 2 нет записей с истекшим сроком действия, то таблица должна быть разблокирована, следующий шаг зависит от того, запускаете ли вы потоки как демоны (в этом случае следует реализоватьэкспоненциальная обратная сторона (например, сон в течение 10 секунд, удваивающийся до 320 секунд для последовательных итераций) или, если вы работаете в пакетном режиме, выход.

0 голосов
/ 30 октября 2013

Спасибо за ваши ответы. Я прошу прощения, я отвечаю немного поздно. Я занялся этой проблемой, а потом забыл об этом посте.

Я много исследовал это. Столкнулся с множеством проблем. Видите ли, 15000 кормов каждый день не так просто.

Может быть, я сумасшедший! :) Но я решил это.

Как?

Я написал свой собственный алгоритм. И да! Это написано на PHP / MYSQL. Я в основном реализовал простой алгоритм взвешенного машинного обучения. Мой алгоритм в основном изучает время публикации о канале, а затем оценивает время следующего опроса для канала. Я сохраняю его в своей БД.

И поскольку это алгоритм обучения, он улучшается со временем. Конечно, есть «промахи». но эти промахи лучше, чем сбой серверов. :)

Я также написал статью об этом. который был опубликован в местном журнале информатики.

Также, что касается увеличения производительности, я получаю улучшение скорости на 500-700% по сравнению с последовательным опросом.

Как дела?

У меня есть БД, которая выросла в размере ТБ. Я использую MySQL. Да, я сталкиваюсь с проблемами перфорации на MySQL. но это не так много Скорее всего, я перейду к какой-нибудь другой БД или добавлю шардинг к моей существующей БД.

Почему я выбрал PHP?

Просто, потому что я хотел показать людям, что PHP и MySQL способны на такие вещи! :)

0 голосов
/ 04 августа 2011

15 000 каналов? Вы должны быть сумасшедшим!

В любом случае, несколько идей:

  1. Увеличение срока выполнения сценария - set_time_limit()
    Не переусердствуйте, но для начала достаточно времени на работу.
  2. Отслеживание последней проверки по URL фида
    Возможно, добавьте поле для каждого канала, last_check и установите в этом поле дату / время последнего успешного извлечения для этого канала.
  3. Обработка меньших партий
    Лучше запускать меньшие партии чаще. Думайте об этом как о PHP-эквиваленте «всех ваших яиц в более чем одной корзине». С указанным выше полем last_check было бы легко идентифицировать тех, у кого самый длинный период с момента последнего обновления, а также установить порог частоты их обработки.
  4. Беги чаще
    Установите cronjob и обработайте, скажем, 100 записей каждые 2 минуты или что-то в этом роде.
  5. Журнал и обзор вашей производительности
    Иметь лог-файлы и записывать статистику. Сколько записей было обработано, сколько времени прошло с момента их последней обработки, сколько времени занял сценарий. Эти метрики позволят вам настроить размеры пакетов, настройки cronjob, сроки и т. Д., Чтобы гарантировать, что максимальные проверки выполняются стабильно.

Установка всего этого может показаться большим трудом по сравнению с одним процессом, но это позволит вам справиться с увеличением громкости пользователей и создаст прочную основу для любых дальнейших задач обслуживания, которые вы, возможно, рассматриваете в будущем. 1037 *

...