Wadslog

[Zend Framework] Zend_FeedをZend_Cacheでキャッシュしたらなんかおかしい?

Jan 21, 2008

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が出ているようです。 データをキャッシュ化する際にシリアライズしていますが、この辺が怪しいと踏んでいます。 明日検証しないといけません。

comments powered by Disqus