SYSTEM238 / NOTES1 / Smarty3関連 / Smarty3でファイルのタイムスタンプを返す修飾子

NOTES1 PROG1
Smarty3でファイルのタイムスタンプを返す修飾子
画像ファイルが更新されない問題の対策のために、Smarty3でファイルのタイムスタンプを返す修飾子を作った。

このプラグインを作った経緯

画像ファイルはローカルPCにキャッシュされるため、サーバの画像を変更してもブラウザをリロードするまで画像が更新されません。

これを回避するために

<img src="hoge.jpg?123456">

のようにパラメターを与えて、キャッシュを無視してサーバから画像ファイルを取得するようにします。

ただ、パラメターにタイムスタンプやランダムな数字を使用すると、画像が更新されていないのにデータが転送されるし、ブラウザのキャッシュも同じ画像ファイルであふれてしまいます。

特に一覧画面で画像を多数表示したりすると酷い事になります。

そこで、修飾子を作って画像ファイルのタイムスタンプをパラメターとして与えてる事にしました。ファイルのタイムスタンプなら画像を変更しない限り変わりませんからね。

作った修飾子

[modifier.s238_file_ts.php]
<?php
/**
 * ファイルのタイムスタンプを取得
 * Type:    modifier
 * Name:    s238_file_ts
 * @param   string  $file   ファイル
 * @param   string  $path   パス
 * @return  string
 */
function smarty_modifier_s238_file_ts($file, $path){
    $pathFile   = $path. basename($file);
    if (!file_exists($pathFile)) return '0';
    return filemtime($pathFile);
}

実行例

[smartyの定義]
{$image = hoge.jpg}
<img src="http://..省略../{$image}?{$image|s238_file_ts:'画像ファイルの格納ディレクトリ'}">

[実行結果]
<img src="http://..省略../hoge.jpg?1441541374">

* ?以降の数値はhoge.jpgの更新日時のunxiタイムスタンプ

注意事項

画像を更新したタイミングか修飾子が呼び出される前に、clearstatcache()を呼び出してファイルステータスのキャッシュをクリアしてください。