2010年6月14日月曜日

PHPを mod_cache (mod_disk_cache)でキャッシュする

Apacheのmod_cacheとmod_disk_cacheを使って、PHPで生成したHTMLをキャッシュする方法のメモ。


Apacheの設定では、LoadModuleでmod_cacheとmod_disk_cacheを有効にする。
そして下記のようにキャッシュの設定をする。

CacheRoot /path/to/cache/dir
#キャッシュ方法と、キャッシュを有効にするURLの先頭部分
CacheEnable disk /test
#上記URLのうち、キャッシュを無効にするURL
CacheDisable /test/not_cache
CacheDirLevels 4
CacheDirLength 5
#クライアントの挙動に関わらずキャッシュを有効にする
CacheIgnoreCacheControl On


PHP側では下記のようにHTTP Response HeaderのLast-ModifiedとExpiresをセットする。(max-ageもセットした方がよい?)
$now = time();
$maxAge = 60;
header('Last-Modified: ' . gmdate('D, d M Y H:i:s T', $now));
header('Expires: ' . gmdate('D, d M Y H:i:s T', $now + $maxAge));
//header("Cache-Control: max-age=$maxAge");

これで60秒間、サーバサイドでもキャッシュされる。
同一クライアントからのアクセスなら、60秒間はクライアントキャッシュが有効。それでもGETしようとしてきた場合(Firefoxで更新ボタンをクリックした場合等)はmod_cacheが304を返してくれる。



PHPでHTTP Response Headerを指定しない場合は、Apacheのキャッシュ設定に下記を追加する。
CacheIgnoreNoLastMod On
CacheDefaultExpire 86400
#キャッシュから1秒以上過ぎたら1日キャッシュを有効にする場合はこんな値で
CacheLastModifiedFactor 86400
CacheMaxExpire 86400

これでHTTP Response Headerを指定しない場合でもサーバサイドのキャッシュが有効になったが、クライアントキャッシュは有効にならないのが残念。
気を利かせて適切なHTTP Response Headerをセットしてくれればいいのに。



キャッシュファイルは定期的にhtcachecleanで掃除する。
(空のディレクトリがうまく削除されない?)



参考

0 件のコメント:

ブログ アーカイブ

tags