【问题标题】:Multiple RSS feeds with PHP (performance)使用 PHP 的多个 RSS 提要(性能)
【发布时间】:2010-08-13 08:26:42
【问题描述】:

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

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

我该怎么做才能使其表现更好

我使用simplexml:

simplexml_load_file($url);

我附加到一个数组中:

function appendToArray($key, $value){
$this->array[$key] = $value;
}

就在展示它之前,我制作了 krsort:

krsort($this->array);

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

【问题讨论】:

    标签: php performance rss feed


    【解决方案1】:

    您可以缓存它们,但如果缓存已过期,您仍然会遇到页面加载时间较长的问题。

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

    【讨论】:

    • 这似乎是最好的主意,也可以在他的回答中看到我对亚当的评论 :) 但仍然感谢!
    【解决方案2】:

    你做过调试吗?在代码的不同点记录microtime

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

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

    【讨论】:

    • 这正是我的想法,但是我需要一些 cronscript 每 30 秒加载一次以保存 xml 文件。重点是我会在添加最新条目时向用户展示它们。
    • 有时你必须做出让步以适应可用资源
    • 感谢您的意见。我将使用静态 xml 文件。
    【解决方案3】:

    您可以与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_curlHow to use curl_multi() without blocking(以及其他)。

    顺便说一句,要在使用 curl_multi 加载提要后处理提要,您当然必须使用 simplexml_load_string 而不是 simplexml_load_file。

    【讨论】:

    • 好点,但您不认为按照其他人的建议保存文件会更好吗?
    • 如果你缓存它们,那么你会偶尔有缓存未命中,如果你不缓存,那么你的脚本总是会命中远程服务器(你总是会有 - 是小 - 延迟)。就个人而言,我会并行获取它们并在有限的时间内缓存它们(这取决于提要的更新频率和您的网站拥有的用户数量,看看什么对您有用)。如果需要,每个提要的缓存期也可能不同(即,如果您知道有些提要比其他提要有更多定期更新)。
    • BTW 缓存本身并不能解决您的问题,正如@Tom Haigh 已经指出的那样。
    【解决方案4】:

    是的,当然缓存是唯一明智的解决方案。
    最好设置一个 cron 作业来检索这些提要并在本地存储数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多