今までブラウザキャッシュに悩まされてきた開発者は多いでしょう。ブラウザのキャッシュを無効化すべく、HTML4以前は次のようなコードをHTML中に書き込んでいたりしました。
<meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="0">
しかしこのコードは現在効きません。
HTML5ではPragma,Cache-Control,Expiresはエラーとなります。そこでHTML5と共にappcacheというキャッシュコントロールの仕様の案が出ました。appcacheは決められた構文に従ってルールが書かれたテキストファイルを作り、そのファイルをhtml要素のmanifest属性で指定して有効化する"ワケ"です。
<html manifest="test.appcache">
CACHE MANIFEST # version: 1.0.0 CACHE: ajax-loader.gif FALLBACK: /main.py /static.html images/large/ images/offline.jpg NETWORK: *
http://qiita.com/hidekuro/items/dea83ebdf73e2f2277ae
https://developer.mozilla.org/ja/docs/Web/HTML/Using_the_application_cache
しかしこのappcacheも非推奨となりました。
本題
ブラウザはサーバにリクエストを送り、サーバからレスポンスコード200と(ほとんどの環境で)Etagと一緒にデータをもらうわけです。次回アクセス時はサーバから受け取ったEtagをリクエストヘッダーに含めることで、サーバにローカルとサーバ上のファイルのEtagを比較させます。Etagが同一であれば304 not modifiedを返し、異なれば200とデータを返します。ブラウザはサーバから304 not modifiedを受け取った場合、キャッシュデータを表示します。
PHPのheader関数でEtagを書き換える
通常であれば、ファイルが更新されればEtagも変更されるわけですが、出力方法などによっては稀に変更されない場合があるようです。そこで、EtagをPHPのheader関数で書き換えてやります。
header( 'Etag:' . time() );
上記コードをファイル先頭に記述しておけば1秒おきにEtagが更新され、キャッシュを読まないでサーバから読んでくれるようになるはずです。
- 関連記事
-
-
PHPでブラウザキャッシュを無効化する方法 2017/04/14
-
phpでローカルか否かを判別する 2017/03/30
-
インスタにアップした画像をPHPで引っ張る 2016/10/27
-
PHP 可変変数「$$」で変数の値を変数名にする 2015/02/26
-
秒数をH:iの形式に変換 2015/02/12
-