2014/02/19

[PHP]Smarty3.1にバージョンアップして困ったこと その2

ウチではPHPのテンプレートライブラリ(テンプレートエンジン)であるSmartyを使ってるんですが、昨年最新版の3.1系にバージョンアップしたら色々困ったことが起きたのでその記録の続きです。




エラーハンドラが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 件のコメント:

コメントを投稿