用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; ?>
我认为你做错了。如果你想解析那么多的提要,你不能从一个将通过网络服务器调用的脚本来完成。
如果你真的想要进行轮询,你必须运行脚本,通过说,cron然后'保存'结果由另一个PHP脚本(可以由HTTP服务器调用)提供服务。
但是,你仍然必须处理很多固有的轮询限制:99%的时间,你将没有新的内容,因此浪费你的CPU,带宽和你正在轮询的服务器。您还将必须处理死饲料,无效饲料,限速等...
实施PubSubHubbub协议。这将有助于已经实施它的供稿,这样您就只需等待将推送给您的数据。
对于其他提要,您可以自己进行轮询,就像您一样,并尝试找到一种方法来避免单个错误(无效的XML,死主机...等)或真的在像Superfeedr这样的服务上(我创建它)。
这是正确的答案 - 脚本需要从命令行运行,否则它将始终(可能)达到最大执行时间。 – 2010-10-19 14:29:25
感谢您使用cron完成的答案 – 2010-10-23 04:05:39
不要忘记实现PubSubHubbub;它会让你的生活变得更容易,当你有很多饲料轮询=) – 2010-10-23 09:18:12
提高您在php.ini memory_limit = xxM
或使用ini_set("memory_limit","xxM")
其中xx
是新的内存限制。
你知道哪些网站使用超过32MB的ram?它的代码不仅仅是它的一个问题。 – RobertPitt 2010-10-19 11:56:37
他从来没有说过它是一个网站。我想他是把它作为脚本运行(cronjob或其他)。 – 2010-10-19 11:59:39
我增加了memory_limit和执行时间,但它需要超过2分钟,但没有结果 – 2010-10-19 11:59:58
我对SimplePie的使用经验是它不是很好或很强壮。请尝试使用simplexml_import_dom()
。
我发现它非常可靠。 – symcbean 2010-10-19 12:19:30
当PHP有这么多内置有用的函数来解析DOM时,是否有必要使用第三方代码? – woodscreative 2010-10-19 12:37:46
是否有任何方法/想法从批量来源快速提取内容?
试图同步轮询所有500个网址会给系统带来很大压力。这可以通过并行运行传输来缓解(使用curl_multi_ *函数 - 但我在这里获得的SimplePie版本不会将这些用于多次传输)。假设组合饲料的请求量很大,那么最好的解决方案是在当前内容设置为过期(应用合理的最小值)时运行调度程序以将饲料下载到服务器,然后将来自存储的数据。请注意,如果采取这种方法,您需要实现一些聪明的信号量或使用DBMS来存储数据--PHP的文件锁定语义并不十分复杂。
也许甚至是stream和'stream_select()' – Fanis 2010-10-19 14:05:56
向我们展示您的代码,您可能会通过在其中保留上下文来填满您的记忆。 – RobertPitt 2010-10-19 11:55:54