frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

Smarty コンパイルタイミング。

Smarty にはキャッシュする以前に

コンパイルしたファイルを /template_c/ 配下に保存してるけど、

compile_check を true にした時

テンプレートファイルのタイムスタンプを

どのくらい厳密に判断して、コンパイルし直してくれるんだろう?

で、Smarty.class.php ん中を見てたら

_is_compiled ってメソッドの中で

_fetch_resource_info メソッド呼び出して

filemtime で最終更新時刻を取得している所を発見。

if ($_params['resource_timestamp'] <= filemtime($compile_path)) {

// template not expired, no recompile

return true;

} else {

// compile template

return false;

}

$_params['resource_timestamp'] がテンプレートファイルの最終更新時刻で

$compile_path はコンパイル後のファイルパスなので

テンプレートファイルとコンパイル後のファイルの最終更新時刻で

Unixタイムスタンプでの比較になる模様。

…という事は、1秒未満の時間、

つまり、例えばミリ秒単位で最終更新時刻の変更があった場合は

コンパイルし直されない、という事になりそうです。

てなこったで、めでたく最終更新時刻の変更があったとみなされた場合

コンパイルしてる間に ob_get_contents でバッファリングしてた内容を

キャッシュファイルに書き込んでいるっぽい。へー。

なにはともあれ、もしコンパイルし直して

キャッシュファイルを更新させたいんだったら、

テンプレートファイルの最終更新日時を

コンパイル後のファイルの最終更新日時より、

1秒以上先にすれば良い模様。

ちなみに、最終更新日時は、訳あって php でやらずに

perl に登場(笑)してもらいたいんで

以下を実行してみる。

・テンプレートファイルの最終更新日時を、コンパイル後のファイルの最終更新日より1秒先にする方法

#!/usr/bin/perl -w

use strict;

my $templateFilePath = 'file.txt';

my $compileFilePath = './template_c/file.txt';

my @templateStat = stat $templateFilePath ;

my @compileStat = stat $compileFilePath;

utime $templateStat[8], $compileStat[9] + 1, $filePath;

exit;

$templateStat[8] はテンプレートファイルの最終アクセス時刻、

$compileStat[9] はコンパイル後のファイルの最終更新時刻どす。