PHP:缓存RSS数据以避免每次页面加载时请求它

时间:2010-03-11 15:38:14

标签: php http caching rss request

我正在解析来自此RSS源的数据:http://rss.accuweather.com/rss/liveweather_rss.asp?metric=1&locCode=SAM|AR|AR005|MONTE%20MAIZ,数据每小时更新一次。

要解析它,我在我的类初始化时加载RSS并将其转换为可用对象。

这个问题是,每次加载页面时,都会再次解析RSS,并且HTTP请求会延迟页面加载。

我在考虑每小时解析一次 cronjob ,然后将数据保存在JSON结构中。但我真的不想依赖于cron,因为并非所有共享托管服务器都提供它(尽管它们应该)。

有关如何执行此操作的其他建议吗?

2 个答案:

答案 0 :(得分:2)

您可以使用Zend_Cache。服务器将首次加载源,但稍后的调用将使用缓存。

实际上,我已经实现了你所详述的内容:

private function _loadFeedEntries($url)
{
    $cache = $this->_getCacheObj();
    $md5   = md5($url);
    if ($result = $cache->load("feed_{$md5}")) {
        return $result;
    }
    $entries = array();
    try {
        $feed = @Zend_Feed::import($url);
        foreach ($feed as $entry) {
            $entries[] = $entry;
        }
    } catch (Exception $e) {
        // ignore this feed.
    }

    $cache->save($entries, "feed_{$md5}");

    return $entries;
}

private function _getCacheObj()
{
    $frontendOptions = array(
        'lifetime' => self::CACHE_LIFETIME,
        'automatic_serialization' => true
    );

    $backendOptions = array(
        'cache_dir' => self::CACHE_DIR
    );

    return Zend_Cache::factory(
        'Core',
        'File',
        $frontendOptions,
        $backendOptions
    );
}

你仍然可以让cronjob调用_loadFeedEntries(),它将缓存结果。 您甚至可以在系统中使用cronjob在每个CACHE_LIFETIME秒内导航到您的站点,从而“保持”缓存更新。

答案 1 :(得分:1)

您可以在页面请求时进行(非常)简单的缓存,以避免依赖于cron。

那是:

当客户端请求您的页面时,请尝试从缓存文件加载数据。如果缓存文件不存在或太旧,请点击服务的RSS源以获取更新并将其写入缓存文件。

如果使用

写入缓存

file_put_contents( FILENAME, json_encode( $some_data_structure ));

你可以用一个简单的

来阅读它

json_decode( file_get_contents( FILENAME ));