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のみに頼らず、キャッシュとあわせて適切に利用することをおすすめします。
コメントを残す