[英]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.