我正在解析来自此RSS源的数据:http://rss.accuweather.com/rss/liveweather_rss.asp?metric=1&locCode=SAM|AR|AR005|MONTE%20MAIZ,数据每小时更新一次。
要解析它,我在我的类初始化时加载RSS并将其转换为可用对象。
这个问题是,每次加载页面时,都会再次解析RSS,并且HTTP请求会延迟页面加载。
我在考虑每小时解析一次 cronjob ,然后将数据保存在JSON结构中。但我真的不想依赖于cron,因为并非所有共享托管服务器都提供它(尽管它们应该)。
有关如何执行此操作的其他建议吗?
答案 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 ));