F.Ko-Jiの「一秒後は未来」

MagpieRSSのキャッシュとConditional GETについて

PHPでRSSをパースするライブラリにMagpieRSSというものがあります。

もう開発が止まっていたりAtom対応が不十分だったりして決して使いやすいとは言えないのですが、昔作ったサービスで使い続けてたりするのでたまに使うことがあります。

さて、MagpieRSSには独自のキャッシュの仕組みがあって、

define('MAGPIE_CACHE_ON', true);
define('MAGPIE_CACHE_AGE', 3600);

のように定数を定義するとキャッシュが有効になります。この設定にしていると、3600秒経過するまではキャッシュを利用し、HTTPリクエストをおこないません。

3600秒を経過後は、もしキャッシュしたRSSに Etag と last-modified がセットされていれば、Conditional GET(条件付きGET)をおこなってくれます。

キャッシュを無効にしたい場合は、

define('MAGPIE_CACHE_ON', false);

という風に MAGPIE_CACHE_ON に false をセットします。この設定にしていると Etag や last-modified ヘッダに関係なく、毎回HTTPリクエストをおこないます。

キャッシュされないということはヘッダの値も保存されないので当然です。

このように、もしMagpieRSSで Conditional GET をおこないたい場合は、

define('MAGPIE_CACHE_ON', true);

の設定が不可欠です。

しかしキャッシュの有効時間を設定していると、その間はHTTPリクエストを送ってくれません。そこで、

define('MAGPIE_CACHE_ON', true);
define('MAGPIE_CACHE_AGE', 0);

のようにキャッシュを有効にしつつキャッシュの有効時間を 0 秒にすれば、毎回 Conditional GET をしてくれるのでは?と思ったのですが、なぜか期待通りの動作をしてくれません。

そこで rss_cache.inc のソースを見てみると、キャッシュの有効期限について次のような処理になっていました。

class RSSCache {
    var $BASE_CACHE = './cache';    // where the cache files are stored
    var $MAX_AGE    = 3600;         // when are files stale, default one hour
    var $ERROR      = "";           // accumulate error messages
    
    function RSSCache ($base='', $age='') {
        if ( $base ) {
            $this->BASE_CACHE = $base;
        }
        if ( $age ) {
            $this->MAX_AGE = $age;
        }

上記の $age に MAGPIE_CACHE_AGE が渡されます。

つまり MAGPIE_CACHE_AGE が 0 だと MAX_AGE はデフォルト値の 3600 がセットされてしまう(キャッシュの有効期間を 0 秒に設定すると、3600 秒になる)ということです。なので期待通りの動作をしなかった、というわけ。

なので、MagpieRSSで毎回 Conditinal GET をしたい場合は MAGPIE_CACHE_AGE に 0 より大きい値をセットする必要があります。

(追記) はてブで「負の値を設定すれば」というコメントをいただきました。たしかに!

ただ、RSSによってはプログラムで出力していて常に200を返すものも少なくありません。リクエストを送っても応答が遅いサーバーも多いです。

したがって、Conditional GETのみに頼らず、キャッシュとあわせて適切に利用することをおすすめします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など