在我最近的项目中,我使用多个RSS源。我想只列出所有帖子的最新帖子,并按时间戳排序。
我的问题是,我有大约20种不同的Feed,页面需要6秒才能加载(仅测试10次Feed)。
我能做些什么来使更好?
我使用simplexml:
simplexml_load_file($url);
我附加到一个数组:
function appendToArray($key, $value){
$this->array[$key] = $value;
}
在展示它之前我做了krsort:
krsort($this->array);
我应该以某种方式缓存它吗?
答案 0 :(得分:2)
您可以缓存它们,但如果缓存已过期,您仍然会遇到需要加载时间的网页问题。
你可以有一个在后台运行的PHP脚本(例如通过cron作业)并定期将你订阅的源下载到数据库中,然后你可以在你想要的时候更快地获取/过滤数据显示它。
答案 1 :(得分:0)
你做过调试吗?在代码中的不同位置记录microtime
。
您会发现加载RSS源而不是解析它需要花费时间,但您可能会发现这是由于每个RSS源生成所需的时间。
将这十个Feed保存为静态xml文件,将脚本指向它们并查看加载速度有多快。
答案 2 :(得分:0)
您可以与curl_multi并行加载RSS源。这可以加速你的脚本,特别是如果你现在正在使用阻止调用。
一个小例子(来自http://www.rustyrazorblade.com/2008/02/curl_multi_exec/):
$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';
可在Asynchronous/parallel HTTP requests using PHP multi_curl和How to use curl_multi() without blocking(以及其他)找到更多信息。
BTW要在使用curl_multi加载Feed后处理这些Feed,您当然必须使用simplexml_load_string而不是simplexml_load_file。
答案 3 :(得分:0)
是的,当然缓存是唯一合理的解决方案 最好设置一个cron作业来检索这些feed并在本地存储数据。