繁体   English   中英

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

[英]PHP: Cache RSS data to avoid requesting it everytime the page loads

我正在从以下RSS feed中解析数据: http ://rss.accuweather.com/rss/liveweather_rss.asp?metric=1&locCode=SAM|AR|AR005|MONTE% 20MAIZ ,那里的数据每小时更新一次。

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

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

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

关于此操作还有其他建议吗?

您可以使用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秒导航到您的站点,从而“保持”缓存更新。

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

那是:

当客户端请求您的页面时,请尝试从缓存文件加载数据。 如果缓存文件不存在或太旧,请访问服务的RSS提要以进行更新,然后将其写入缓存文件。

如果您使用以下命令写入缓存

file_put_contents( FILENAME, json_encode( $some_data_structure ));

你可以用一个简单的阅读

json_decode( file_get_contents( FILENAME ));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM