alhames.ru
Вообщем, такая задача:
имеется 100-200 rss-каналов, имеется сайт на котором выводятся сообщения из этих каналов.
При поступлении нового сообщения оно добавляется в базу данных и висит там до тех пор, пока не будет прочитано администратором, либо пока не истечет срок хранения.
Т.е., к примеру, за день накапливается очередь таких сообщений и вечером администратор ее просматривает.
Как реализовать?

Первое что приходит в голову - повесить на cron скрипт, который:
1) запрашивает filemtime() rss-файла и если он не соответствует последнему сохраненному - добавляет файл в очередь;
2) по очереди тащит из файла инфу с помощью file_get_contents(), парсит и добавляет последние сообщения в бд;
3) удаляет из бд все сообщения, хранящиеся дольше определенного промежутка.
Но при таком количестве rss-лент скрипт будет посылать огромное количество запросов. Можно, конечно, проверять через каждые 5 минут к примеру по 20 rss-лент, но тогда есть вероятность большой задержки между появлением сообщения в rss-ленте и добавлением его в бд.


Комментарии
18.02.2010 в 19:11

Всё будет Кока-Кола.
1) Парсим через SimpleXML, например.
2) Запрос делаем через сокеты или CURL. Предварительно читаем про HTTP кеширование и посылает соответствующие заголовки, если на новостной стороне соответствующая опция настроена - расходы на траффик будут минимальные.
3) Сохраняем в базе или в файле время последнего обращения к rss каналу, при превышении лимита вызывает, но не более нескольких за раз. И все вешаем на крон, например 5 минутный.
4) Как хранить уже не принципиально, можно все забивать в базу с привязкой по времени, и раз в неделю грохать старые записи.
18.02.2010 в 19:18

 
Джей Ди все сказал, но отмечусь:
а) filemtime() не работает по HTTP, так что да, использовать механизм кэширования HTTP (но при этом учесть, что кое-где он не используется);
б) у RSS есть поле TTL (в минутах), содержащее рекомендации по частоте обновления;
в) O_o я всегда считал нормальным интервалом обновления RSS промежуток 1-24 часа, а не пять минут. но дело хозяйское.
18.02.2010 в 19:52

Всё будет Кока-Кола.
La personne mystique а кто говорил, что это интервал обновления? Это интервал чекинга "Сохраняем в базе или в файле время последнего обращения к rss каналу, при превышении лимита вызывает" - что означает, if (time()-$last_visit>$limit) - так что можно ставить различные интервалы на разные каналы, и кстати получать его из ttl тоже можно.
18.02.2010 в 20:55

alhames.ru
2) Запрос делаем через сокеты или CURL. Предварительно читаем про HTTP кеширование и посылает соответствующие заголовки, если на новостной стороне соответствующая опция настроена - расходы на траффик будут минимальные.
Сокеты не пашут, надо будет CURL попробовать.

б) у RSS есть поле TTL (в минутах), содержащее рекомендации по частоте обновления;
таймаут запросов к различным рсс-лентам будет считаться отдельно на основе частоты их обновлений. Пока что это не столь важно

я всегда считал нормальным интервалом обновления RSS промежуток 1-24 часа, а не пять минут.
Это корректно для рсс-новостей и т.п. - т.е. что врятли обновляется чаще чем раза два в сутки. Мне же надо тянуть френдленту )
19.02.2010 в 01:47

Flash Flesh n Cash
не понял вопроса.
читать rss, парсить сравнивать даты сохраненных собщений и новых. записывать новые.
в чем сложность-то?
19.02.2010 в 05:57

alhames.ru
Злые тапки в том что с 200-ми лентами и маленькой частотой обновления будет большая нагрузка.
Вот и спрашиваю, как поступить лучше..
19.02.2010 в 15:34

Flash Flesh n Cash
alhames передавайте if-modified-since в заголовке запроса. это должно сократить количество лишнего трафика
19.02.2010 в 16:28

Всё будет Кока-Кола.
Злые тапки
2) Запрос делаем через сокеты или CURL. Предварительно читаем про HTTP кеширование и посылает соответствующие заголовки, если на новостной стороне соответствующая опция настроена - расходы на траффик будут минимальные.
:D

Расширенная форма

Редактировать

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail