LoginSignup
1
0

More than 5 years have passed since last update.

ファイル更新時刻をもとにクエリストリングを自動生成する

Last updated at Posted at 2018-07-27

キャッシュとの戦い

デザイナーの変更が反映されていないのは、だいたいキャッシュのせい。
それも、ブラウザキャッシュです。
ウェブサーバーに設定を書いても、スーパーリロードしても、なぜか思うように消えないブラウザキャッシュとの戦い。

(´-`).。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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0