Zend_Feedで取得したRSSをZend_Cacheでキャッシュ化したところ、キャッシュ化したデータを取得したときのデータが壊れているようでした。 以下にリファレンスガイドからまるパクリの例なのですが、最後のforeachでWarningがでたりして、データがうまく取得できません。
require\_once 'Zend/Feed.php';
require\_once 'Zend/Cache.php';
$frontendOptions = array(
'lifetime' => 30, // キャッシュの有効期限は30秒
'automatic\_serialization' => true // キャッシュの自動シリアライズ化
);
$backendOptions = array(
'cache\_dir' => '/tmp'
);
$cache = Zend\_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
if(!$result = $cache->load('rss')) {
try {
$result = Zend\_Feed::import('http://wadslab.net/category/Zend\_Auth/atom/');
} catch (Zend\_Feed\_Exception $e) {
// フィードの読み込みに失敗しました
echo "フィードの読み込み中に例外が発生: {$e->getMessage()}n";
exit;
}
$cache->save($result, 'rss');
}
// チャネルデータの配列を初期化します
$channel = array(
'title' => $result->title(),
'link' => $result->link(),
'description' => $result->description(),
'items' => array()
);
// チャネルの各項目をループし、関連するデータを保存します
foreach ($result as $item) {
$channel\['items'\]\[\] = array(
'title' => $item->title(),
'link' => $item->link(),
'description' => $item->description()
);
}
ちなみに、RSSの各要素を格納した$channelをキャッシュするようにしたところうまくいきました。 もう少し細かく見たところ、 Zend_Feed::importで取得した結果がZend_Feed_Rssのオブジェクト型で戻るのですが、このなかの_elementメンバ変数がおかしくなっていました。 Zend_Feed_RssはZend_Feed_Abstractを継承、さらにZend_Feed_AbstractはZend_Feed_Elementを継承しています(_elementはZned_Feed_Elementのメンバ変数)。Zend_Feed_ElementはArrayAccessインターフェースを実装しているのでforeachが効くわけなのですが、これがすでに壊れてしまっているのでWarningが出ているようです。 データをキャッシュ化する際にシリアライズしていますが、この辺が怪しいと踏んでいます。 明日検証しないといけません。