エラーハンドラがfiletime()やunlink()実行時のエラーを拾ってしまう。
他にも困ってる人がいました。
http://k-holy.hatenablog.com/entry/2012/05/10/212139
file_exists()等でファイルの存在確認をせずに@filetime()したり@unlink()したりしているせいで、独自のエラーハンドラーが拾ってしまう罠でした。
で、Smarty3.1のソースをいろいろ見てみると、
Smarty.class.phpの
Smarty->muteExpectedErrors()
のところに、以下のコメントがありました。
Smarty deliberately uses @filemtime() over file_exists() and filemtime() in some places. Reasons include
- @filemtime() is almost twice as fast as using an additional file_exists()
- between file_exists() and filemtime() a possible race condition is opened,
which does not exist using the simple @filemtime() approach.
うーん。
実際には1ファイルあたり0.01秒とかなんで別に気にしないんだけどなー。
それくらいは覚悟してSmarty使ってるつもりだし。
ちなみに3.0.9のソースの同じ個所では、ちゃんとfile_exists()で分岐してました。
Smartyのlibs配下のファイルを編集するのはもちろんやめた方がいいので、
Smartyを使う場合は独自のエラーハンドラーを使うのをやめる。
どうしても使う場合は
display()とかfetch()の前に$Smarty->muteExpectedErrors()後に$Smarty->unmuteExpectedErrors()を入れるようにする。
とかで回避できます。
が、どちらにしても、個人的にはあまり好きな書き方ではなく、ちょっと残念な気持ちになります。
まだ続く予定です。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。