いろいろ準備中

[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が出ているようです。

データをキャッシュ化する際にシリアライズしていますが、この辺が怪しいと踏んでいます。
明日検証しないといけません。

コメントを投稿する