phpなどで動的生成したページの更新を確実にブラウザに伝える方法

php・MySQL・Web開発

PHP-logo

PHPなどを使って動的に生成されたページの内容を変更した際に、ブラウザの「更新ボタン」や「F5」を押しただけでは上手く更新されないことがあります。

たとえば、phpスクリプト内で

<h1>これはタイトルです</h1>

と書いてHTML出力していたものを修正して

<h1>これはタイトルですよ!</h1>

と変更したときに、ブラウザの表示が「これはタイトルです」のままで、いくらリロードしても「これはタイトルですよ!」に変わらないことがあります。

そういうとき、「Ctrl+F5」だと更新される。
要するにブラウザが保存しているキャッシュを強制的にリロードしてやる必要があるわけです。

ブラウザの仕様や設定にも左右されるところがあるかと思いますが、私が使っているChrome最新版ではそのような挙動になっています。

普通の静的なHTMLファイルの場合

一方、通常のHTMLファイルであれば、こういった問題は起きにくいと思われます。
Webサーバ(Apacheなど)がそのファイルの変更時刻を読み取って「Last-Modifiedヘッダ」を送信してくれるためです。

そこで、動的に生成するページにおいては、自分で任意のLast-Modifiedヘッダを生成してブラウザに伝える必要があります。

phpでLast-Modifiedヘッダを生成する例

$time_newest = 1418257802;//タイムスタンプ
header( "Last-Modified: " . gmdate( "D, d M Y H:i:s", $time_newest ) . " GMT" );

上記のようなコードを使って、タイムスタンプの部分の数字を随時変更すればOKです。
headerなので、他の出力(echo等)よりも先に記述したほうが良いでしょう。

ページ内容の変更頻度が低いサイトであれば、この方法で手動でタイムスタンプを変更しておけば大丈夫ですね。

これで、冒頭の例とは違い、ブラウザで「Ctrl+F5」ではなく普通に「F5(または更新ボタン)」を押すだけでページ内容がリフレッシュされるようになります。

自動化するなら工夫を

ページ内容に変更があるたびにUNIXタイムスタンプの数字を書き換えるのは面倒だ、という場合は、

$time_newest = time();//タイムスタンプ

と自動化する手段もあります。

しかし、こうしてしまうとキャッシュを一切使わないのと同義になってしまいます。
サイト訪問者からのアクセスがあるたびに(ページの変更がなくても)新しくページが生成されてしまい、サーバ資源・回線資源の無駄遣いになります。

さらにGoogle様からもかなり嫌われてしまいそうな予感がしますので、これはやめておくべきでしょう。

どうしても自動でやりたい場合は、たとえば「1日1回」の更新になるようにコードを工夫してみてはいかがでしょうか。

memcachedとか使えばその辺うまくやってくれるのかもしれませんが、私は使ったことがないのでよく分かりません。そう大規模でもないサイトの場合、この記事で紹介したような簡便なやり方のほうをオススメします。

PHPで動的生成したページを絶対にブラウザにキャッシュさせない方法
PHPで動的に生成しているサイトがあるのですが、ブラウザ(Chrome)がキャッシュしたものが消えてくれず、「Shift+F5」で強制クリアしないと更新されない状況に困っていました。 <html lang="ja" manifest="">...

コメント

タイトルとURLをコピーしました