PHPでファイルを修正するたびにhash_fileでキャッシュ無効化

PHPでキャッシュのクエリーを生成

CSSやJavaScriptではキャッシュを防止するためにファイルのURLの語尾に?20200123のような日付を付けることがある。

<link rel="stylesheet" href="https://iwb.jp/foo.css?20200123">

例えば上記の語尾を?20201204のように変えるとブラウザは必ずキャッシュからは読み込まないのでファイルを修正した場合は修正内容が必ず反映される。

クエリ文字列を自動更新

ファイルのURLの語尾の?以降を変えるとキャッシュを読み込まないが、逆に言うとクエリ文字列を変えなければキャッシュが読み込まれるためファイルの修正内容が反映されなくなってしまう。
(キャッシュが有効の場合)

手動だとクエリ文字列の修正は忘れやすい。しかし、PHPであればファイルの修正日時からクエリ文字列を自動生成できるので変更のし忘れが発生しなくなる…という記事を半年前に書いたのだが、これには問題がある。

クエリ文字列が日付だと戻しても更新

クエリ文字列が日付だとファイルを前の内容に戻しても更新されてしまう。

例えばCSSのbodyをbackground: pinkにしたが、これをやめて以前の指定に戻したとしてもファイル自体は更新されているのでクエリ文字列が更新されてしまう。(キャッシュが読み込まれない)

hash_fileでハッシュ値を生成

この問題を解決できるのがhash_fileでハッシュ値を生成する方法だ。

例えばindex.cssというファイルがあった場合、hash_fileを使用すると32桁のハッシュ値が生成される。

<?= hash_file('md5', 'index.css'); ?>
/* b92f86df20a732a704421274fefbedf7 */

これだと長いので先頭の6桁だけ使用する。

<?= substr(hash_file('md5', 'index.css'), 0, 6); ?>
/* b92f86 */

CSS hash_file sample

カテゴリーphp