Разбор RSS-каналов с помощью PHP - PullRequest
1 голос
/ 19 октября 2010

Мне нужно агрегировать RSS-контент из примерно 500 URL-адресов, в то время как я пытаюсь получить контент из-за истечения времени ожидания / исчерпания памяти в этих URL (я пытаюсь использовать библиотеку SimplePie).метод / идея быстрого извлечения контента из массовых источников?

Как мне каждый раз получать свежее содержимое?

<?php
require_once('include/simplepie.inc');    
$urlList = array('http://site1.com/index.rss',
'http://site1.com/index.rss',
'http://site2.com/index.rss',
'http://site3.com/index.rss',
'http://site500.com/index.rss',
);  
$feed = new SimplePie();  
$feed->set_feed_url($urlList);  
$feed->init();  
$feed->handle_content_type();  
?>

html часть

<?php  
foreach($feed->get_items() as $item):  
?>  
<div class="item">
<h2><a href="<?php echo $item->get_permalink(); ?>"><?php echo $item->get_title(); ?></a></h2>
<p><?php echo $item->get_description(); ?></p>
<p><small>Posted on <?php echo $item->get_date('j F Y | g:i a'); ?></small></p>
</div>
<?php endforeach; ?>

Ответы [ 4 ]

2 голосов
/ 19 октября 2010

Я думаю, вы делаете это неправильно. Если вы хотите проанализировать такое количество каналов, вы не можете сделать это из сценария, который будет вызываться через веб-сервер.

Если вы действительно хотите выполнить опрос, вам придется запустить этот скрипт, скажем, cron, а затем «сохранить» результаты, которые будут обслуживаться другим PHP-скриптом (который может вызываться HTTP-сервером).

Однако вам все равно придется столкнуться с множеством ограничений, присущих опросу: в 99% случаев у вас не будет нового контента, что приводит к напрасной трате вашего ЦП, пропускной способности и серверов, которые вы опрашиваете. Вам также придется иметь дело с мертвыми фидами, недействительными, ограничением скорости и т. Д. *

Реализация протокола PubSubHubbub . Это поможет тем фидам, которые его реализовали, так что вам просто нужно дождаться данных, которые будут переданы вам.

Для других каналов вы можете выполнить опрос самостоятельно, как вы это делали, и попытаться найти способ избежать отдельных ошибок (недопустимый XML, неработающие хосты ... и т. Д.) Или действительно использовать такой сервис, как Superfeedr (я его создал).

1 голос
/ 19 октября 2010

Есть ли какой-нибудь метод / идея для быстрого извлечения контента из массовых источников?

попытка опроса всех 500 URL-адресов синхронно создаст большую нагрузку на систему. Это может быть смягчено путем параллельного запуска передач (с использованием функций curl_multi_ * - но версия SimplePie, которую я здесь привожу, не использует их для нескольких передач). Предполагая, что объем запросов для составных каналов заслуживает этого, тогда лучшим решением было бы запустить планировщик для загрузки каналов на ваш сервер, когда истекает срок действия текущего содержимого (применяя разумное минимальное значение), а затем составлять канал из сохраненные данные. Обратите внимание, что если вы воспользуетесь этим подходом, вам потребуется реализовать несколько умных семафоров или использовать СУБД для хранения данных - семантика блокировки файлов PHP не очень сложна.

1 голос
/ 19 октября 2010

Мой опыт работы с SimplePie заключается в том, что он не очень хороший или надежный. Попробуйте вместо этого использовать simplexml_import_dom().

0 голосов
/ 19 октября 2010

Увеличьте memory_limit = xxM в php.ini или используйте ini_set("memory_limit","xxM"), где xx - новый предел памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...