[Zend Framework] Zend_FeedをZend_Cacheでキャッシュしたらなんかおかしい?
1月 21st, 2008 Posted in Zend Framework
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が出ているようです。
データをキャッシュ化する際にシリアライズしていますが、この辺が怪しいと踏んでいます。
明日検証しないといけません。