とあるサイトでFacebookページに投稿された内容をGraph APIで取得して表示させています。(ちなみに、ANA 『STAR WARS プロジェクト』のサイトでも利用されています。)
PHP SDKを利用してAPIにアクセスするのですが、数件の投稿と投稿に紐付く画像(300px前後のサイズ)を取得するだけでも5秒前後かかります。このまま利用するとページの読み込みに非常に時間がかかるページとなり、ユーザーが離脱してしまう可能性があります。
そこで、手軽に利用できるキャッシュシステム「PEAR Cache_Lite」を利用することにしました。APIで取得したデータをサーバーのキャッシュ用ディレクトリにファイルで保存することができるもので、CPIのACE 01のような共用レンタルサーバーでも動作します。
キャッシュの有効期限とcronの設定
どのキャッシュシステムでも「いつまでキャッシュを有効にするか」という有効期限の設定があります。今回話題にしているサイトはそれほど投稿数は多くないのですが、投稿してからwebサイトに反映されるのが遅いのも困ります。そこで3,600秒(1時間)に設定しました。
キャッシュの有効期限が切れた後、最初にアクセスしたユーザーはFacebook Graph APIへのアクセスが発生してしまうため、ページの読み込みが非常に遅くなってしまいます。そこでcronを用いてPHPを実行させ、常にFacebookのデータがキャッシュされている状態を作り出すことにしました。
キャッシュが更新されない
しかし、cronを設定した後、キャッシュの有効期限が切れているであろうにもかかわらず、キャッシュが再生成されない現象を確認しました。Cache_Liteのコードは次のようになっており、_refreshTime
(time() - $this->_lifeTime
)キャッシュファイルのタイムスタンプが現在時刻-3600より大きい場合のみキャッシュが返されるようになっています。
if ((file_exists($this->_file)) && (@filemtime($this->_file) > $this->_refreshTime)) {
$data = $this->_read();
}
検討したところ、Graph APIの応答時間には若干の差が生じることによるものと考えました。例えば14時にアクセスした場合は応答に少し時間を要した、15時にアクセスした場合はスピーディーに応答があった場合、@filemtime($this->_file) > $this->_refreshTime
が「正」になってしまう可能性があるということです。もしかするとファイルの書き込みの時間の影響もあるかもしれません。
キャッシュの有効期限の工夫
そこで、キャッシュの有効期限をわずかに短い時間、3,590秒(0:59:50)を設定してみました。結果、想定通りcronでキャッシュが更新されるようになりました。これにより、キャッシュの有効期限が切れてページの読み込みが遅くなるユーザーはほぼないと考えられます。(ベストエフォートで...。)
まとめ
キャッシュの有効期限はキリの良い時間を設定することが多いですが、状況によっては不都合が生じることが分かりました。プログラムをよく検討した上で設定を行い、ユーザーのみなさまには常に良いパフォーマンスでページを閲覧して頂けるよう、工夫をしていきたいと思います。