キャッシュとの戦い
デザイナーの変更が反映されていないのは、だいたいキャッシュのせい。
それも、ブラウザキャッシュです。
ウェブサーバーに設定を書いても、スーパーリロードしても、なぜか思うように消えないブラウザキャッシュとの戦い。
(´-`).。oO(つらい)
URLの後ろに ?
をつける日々
URLにその都度クエリストリングを付加することで、ブラウザキャッシュを回避することはできます。
今どきのPHPフレームワークなら、自動でやってくれるでしょうが、素のPHPや古いフレームワークだと、それをいちいち手動でやらないといけません。
ただキャッシュさせないだけなら現在時間を使えばいいでしょうが、読み込みのためには、変更がないときは逆にキャッシュを使ってほしい。
デプロイした時間をどこかのファイルに書き込んで利用するのも手でしょうが、未変更のファイルまで読み込まれるのも困ります。
PHPのfilemtime
関数で、最終更新時刻が取れるので、それを使いましょう。
実装(フレームワーク非依存)
PHPのマニュアルによるとfilemtime
関数はキャッシュするそうですが、一度のスクリプト内のみキャッシュする らしいので、おそらく大丈夫でしょう……。
hoge.php
class Util
{
const PROJECT_ROOT = '/path/to/www_root';
private static function getFileLastUpdateTime($path)
{
//一応ディレクトリトラバーサル対策
if (preg_match('/\.\./', $path)) {
return false;
}
return filemtime(realpath(self::PROJECT_ROOT . '/htdocs' . $path));
}
public static function getQueryStringPath($path)
{
$modified = static::getFileLastUpdateTime($path);
if (!modified) {
$modified = '';
}
return $path . '?' . $modified;
}
}
// /path/to/www_root/htdocs/css/main.css の最終更新日を取得
echo Util::getQueryStringPath('/css/main.css');
// =>/css/main.css?1532503558