用PHP解析RSS源

用PHP解析RSS源

问题描述:

我需要从大约500个URL中汇总RSS内容,而我试图从这些URL的超时/内存耗尽错误(我尝试使用SimplePie库)中获取内容。用PHP解析RSS源

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

每次如何获取新鲜内容?

<?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; ?> 
+1

向我们展示您的代码,您可能会通过在其中保留上下文来填满您的记忆。 – RobertPitt 2010-10-19 11:55:54

我认为你做错了。如果你想解析那么多的提要,你不能从一个将通过网络服务器调用的脚本来完成。

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

但是,你仍然必须处理很多固有的轮询限制:99%的时间,你将没有新的内容,因此浪费你的CPU,带宽和你正在轮询的服务器。您还将必须处理死饲料,无效饲料,限速等...

实施PubSubHubbub协议。这将有助于已经实施它的供稿,这样您就只需等待将推送给您的数据。

对于其他提要,您可以自己进行轮询,就像您一样,并尝试找到一种方法来避免单个错误(无效的XML,死主机...等)或真的在像Superfeedr这样的服务上(我创建它)。

+0

这是正确的答案 - 脚本需要从命令行运行,否则它将始终(可能)达到最大执行时间。 – 2010-10-19 14:29:25

+0

感谢您使用cron完成的答案 – 2010-10-23 04:05:39

+0

不要忘记实现PubSubHubbub;它会让你的生活变得更容易,当你有很多饲料轮询=) – 2010-10-23 09:18:12

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

+0

你知道哪些网站使用超过32MB的ram?它的代码不仅仅是它的一个问题。 – RobertPitt 2010-10-19 11:56:37

+0

他从来没有说过它是一个网站。我想他是把它作为脚本运行(cronjob或其他)。 – 2010-10-19 11:59:39

+0

我增加了memory_limit和执行时间,但它需要超过2分钟,但没有结果 – 2010-10-19 11:59:58

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

+0

我发现它非常可靠。 – symcbean 2010-10-19 12:19:30

+0

当PHP有这么多内置有用的函数来解析DOM时,是否有必要使用第三方代码? – woodscreative 2010-10-19 12:37:46

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

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

+0

也许甚至是stream和'stream_select()' – Fanis 2010-10-19 14:05:56