我需要聚合来自大约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; ?>
答案 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
是新的内存限制。