使用PHP解析RSS源

时间:2010-10-19 11:52:53

标签: php rss

我需要聚合来自大约500个URL的RSS内容,而我正在尝试从这些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 个答案:

答案 0 :(得分:2)

我认为你做错了。如果要解析那么多源,则不能通过将通过Web服务器调用的脚本来执行此操作。

如果你真的想要进行轮询,你必须通过说cron运行该脚本,然后“保存”由另一个PHP脚本(可以由HTTP服务器调用)提供的结果。

但是,您仍然需要处理轮询的许多固有限制:99%的情况下,您将没有新内容,从而浪费您的CPU,带宽和您正在轮询的服务器。您还必须处理死信号,无效信号,速率限制等...

实施PubSubHubbub协议。它将有助于已实现它的提要,因此您只需等待将推送给您的数据。

对于其他供稿,您可以自己进行轮询,就像您一样,并尝试找到一种方法来避免个别错误(不是有效的XML,死主机等等),或者真的在像{{{}这样的服务上3}}(我创造了它)。

答案 1 :(得分:1)

我对SimplePie的体验是它不是很好或很强大。请尝试使用simplexml_import_dom()

答案 2 :(得分:1)

  

是否有任何方法/想法可以快速从批量来源中提取内容?

尝试同步轮询所有500个网址会给系统带来很大的压力。这可以通过并行运行传输来缓解(使用curl_multi_ *函数 - 但我在这里使用的SimplePie版本不会将这些用于多次传输)。假设对复合订阅源的请求量很大,那么最好的解决方案是运行调度程序,在当前内容设置为过期(应用合理的最小值)然后合并来自服务器的订阅源时将订阅源下载到服务器存储的数据。请注意,如果采用这种方法,您需要实现一些聪明的信号量或使用DBMS来存储数据 - PHP的文件锁定语义不是很复杂。

答案 3 :(得分:0)

在php.ini中增加memory_limit = xxM或使用ini_set("memory_limit","xxM"),其中xx是新的内存限制。