使用PHP的多个RSS源(性能)

使用PHP的多个RSS源(性能),php,performance,rss,feed,Php,Performance,Rss,Feed,在我最近的项目中,我使用多个rss提要。我只想列出所有人的最新帖子,并按时间戳排序 我的问题是,我有大约20个不同的提要,页面加载需要6秒钟(仅测试10个提要) 我能做些什么使它的性能更好 我使用simplexml: simplexml_load_file($url); 我将其附加到数组中: function appendToArray($key, $value){ $this->array[$key] = $value; } 在展示之前,我做了一个krsort: krsort($th

在我最近的项目中,我使用多个rss提要。我只想列出所有人的最新帖子,并按时间戳排序

我的问题是,我有大约20个不同的提要,页面加载需要6秒钟(仅测试10个提要)

我能做些什么使它的性能更好

我使用simplexml:

simplexml_load_file($url);
我将其附加到数组中:

function appendToArray($key, $value){
$this->array[$key] = $value;
}
在展示之前,我做了一个krsort:

krsort($this->array);

我应该以某种方式缓存它吗?

您进行过任何调试吗?在代码中的不同点记录
microtime

您会发现,需要时间的是RSS提要的加载,而不是解析,但您可能会发现这是由于每个RSS提要生成所需的时间


将这十个提要另存为静态xml文件,将脚本指向它们并查看加载速度。

您可以缓存它们,但如果缓存过期,则仍然存在页面加载耗时的问题


您可以有一个在后台运行的PHP脚本(例如,通过cron作业),定期将订阅的提要下载到数据库中,然后您可以在需要显示数据时更快地获取/过滤数据。

您可以并行加载RSS提要。这可以加快脚本的速度,尤其是当您目前正在使用阻塞调用时

一个小例子(来自:

$nodes=array('http://www.google.com', 'http://www.microsoft.com', 'http://www.rustyrazorblade.com');
$node_count=计数($nodes);
$curl_arr=array();
$master=curl_multi_init();
对于($i=0;$i<$node_count;$i++)
{
$url=$nodes[$i];
$curl\u arr[$i]=curl\u init($url);
curl_setopt($curl_arr[$i],CURLOPT_RETURNTRANSFER,true);
curl_multi_add_句柄($master,$curl_arr[$i]);
}
做{
curl_multi_exec($master,$running);
}而($running>0);
回声“结果:”;
对于($i=0;$i<$node_count;$i++)
{
$results=curl\u multi\u getcontent($curl\u arr[$i]);
echo($i.\n.$results.\n”);
}
回音“完成”;
更多信息请访问和(以及其他网站)


顺便说一句,要在使用curl\u multi加载提要后处理提要,您当然必须使用而不是simplexml\u load\u文件。

是的,当然缓存是唯一明智的解决方案。

最好设置一个cron作业来检索这些提要并在本地存储数据

这正是我的想法,但是我需要一些cronscript来每隔30秒加载一次来保存xml文件。问题是,我会在用户添加时向他们显示最新的条目。有时,你必须做出让步,以适应您输入的可用资源。我将使用静态xml文件。这似乎是最好的主意,也可以在adam的回答中看到我对他的评论:)但还是谢谢!这一点很好,但你不认为按照其他人的建议保存文件会更好吗?如果缓存它们,那么每隔一段时间就会有一次缓存未命中,如果不缓存,那么脚本将始终命中远程服务器(并且总是会有一点延迟)。就我个人而言,我会并行获取它们,并在有限的时间内缓存它们(这取决于提要更新的频率和您的站点拥有的用户数量,看看什么对您有效)。如果需要,每个feed的缓存周期也可能不同(即,如果您知道一些feed比其他feed有更多的定期更新)。顺便说一句,正如@Tom Haigh已经指出的那样,缓存本身并不能解决您的问题。
$nodes = array('http://www.google.com', 'http://www.microsoft.com', 'http://www.rustyrazorblade.com');
$node_count = count($nodes);

$curl_arr = array();
$master = curl_multi_init();

for($i = 0; $i < $node_count; $i++)
{
    $url =$nodes[$i];
    $curl_arr[$i] = curl_init($url);
    curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($master, $curl_arr[$i]);
}

do {
    curl_multi_exec($master,$running);
} while($running > 0);

echo "results: ";
for($i = 0; $i < $node_count; $i++)
{
    $results = curl_multi_getcontent  ( $curl_arr[$i]  );
    echo( $i . "\n" . $results . "\n");
}
echo 'done';