Smarty コンパイルタイミング。
Smarty にはキャッシュする以前に
コンパイルしたファイルを /template_c/ 配下に保存してるけど、
compile_check を true にした時
テンプレートファイルのタイムスタンプを
どのくらい厳密に判断して、コンパイルし直してくれるんだろう?
_is_compiled ってメソッドの中で
_fetch_resource_info メソッド呼び出して
filemtime で最終更新時刻を取得している所を発見。
$_params['resource_timestamp'] がテンプレートファイルの最終更新時刻でif ($_params['resource_timestamp'] <= filemtime($compile_path)) {
// template not expired, no recompile
return true;
} else {
// compile template
return false;
}
$compile_path はコンパイル後のファイルパスなので
テンプレートファイルとコンパイル後のファイルの最終更新時刻で
Unixタイムスタンプでの比較になる模様。
…という事は、1秒未満の時間、
つまり、例えばミリ秒単位で最終更新時刻の変更があった場合は
コンパイルし直されない、という事になりそうです。
てなこったで、めでたく最終更新時刻の変更があったとみなされた場合
コンパイルしてる間に ob_get_contents でバッファリングしてた内容を
キャッシュファイルに書き込んでいるっぽい。へー。
なにはともあれ、もしコンパイルし直して
キャッシュファイルを更新させたいんだったら、
テンプレートファイルの最終更新日時を
コンパイル後のファイルの最終更新日時より、
1秒以上先にすれば良い模様。
ちなみに、最終更新日時は、訳あって php でやらずに
perl に登場(笑)してもらいたいんで
以下を実行してみる。
・テンプレートファイルの最終更新日時を、コンパイル後のファイルの最終更新日より1秒先にする方法
#!/usr/bin/perl -w$templateStat[8] はテンプレートファイルの最終アクセス時刻、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;
$compileStat[9] はコンパイル後のファイルの最終更新時刻どす。