2011-08-19 33 views
8

PHPのfilemtime関数に問題があります。私のwebappでは、キャッシュオプション付きのSmartyテンプレートエンジンを使用します。私のwebappでは、エラーを生成するいくつかのアクションを実行できますが、1つのアクションのみに焦点を当てることができます。私がページ上のリンクをクリックすると、いくつかのコンテンツが更新されます。何回かクリックするとすべてOKですが、10件につき1つのリクエストが失敗します。エラーが続いて発生します。PHP filemtime関数 - 「statが失敗しました」

filemtime() [<a href='function.filemtime'>function.filemtime</a>]: stat failed for 

と、問題の原因となるライン:あなたが見ることができるようにそれがチェックされているので

return ($_template->getCachedFilepath() && file_exists($_template->getCachedFilepath())) ? filemtime($_template->getCachedFilepath()) : false ; 

は、ファイルが存在します。

コードの問題の行がsmarty_internal_cacheresource_file.phpに含まれている(SmartyのLIBのv3.0.6の一部)

のAppは、UNIXシステム、外部のホスティング上で実行されます。

アイデア?私は詳細を掲載すべきですか?

+0

ジャストノート:親ディレクトリが読めるのですか? –

+0

はいそれは可読です – lbednaszynski

答えて

10

file_existsは内部有効ユーザとしてチェックを実行filemtimestatを使用するのに対し、ユーザとしての権限をチェックaccessシステムコールを使用します。したがって、この問題は有効なユーザー==実際のユーザーの前提に根差している可能性がありますが、これは成立しません。もう1つの説明は、ファイルが2つの呼び出しの間で削除されることです。

$_template->getCachedFilepath()の結果とファイルの存在がシステムコール間で変更される可能性があるので、なぜfile_existsに電話するのですか?代わりに、私はちょうど

return @filemtime($_template->getCachedFilepath()); 

$_template->getCachedFilepath()はダミーの値などfalseに設定することができた場合は、以下の使用をお勧めしたい:

$path = $_template->getCachedFilepath(); 
if (!$path) return false; 
return @filemtime($path); 
+0

2つの呼び出しの間にファイルが消えることがありますが、私はこのアプリケーションをテストする人です。私はまた、なぜそれが私のために奇妙なのか、それは1人のユーザのためだけにテストします。 @記号を付けることでエラーを無視できますが、問題は消えません。 – lbednaszynski

+1

エラー抑制を含む解決策は好きではありませんが、有効/実際のメモは+1です。 @marchewaは、ファイルのパーミッションをチェックします。 –

+0

すべてのキャッシュファイルのパーミッションは0644(rw-r - r--)です。私のスクリプトは、これらのファイルを作成、削除、読み込もうとします。私が言ったように、リクエストの約10%しか失敗しません。 – lbednaszynski

0

私は長年、「file_exists」をチェックせずfilemtime正常に使用しました。私が常にドキュメントを解釈してきた方法は、エラーが発生したときに "filemtime"からFALSEを返さなければならないということです。それから数日前に何か非常に奇妙なことが起こった。ファイルが存在しない場合、私のCronジョブは結果で終了しました。結果はプログラムの出力ではなく、Cronの出力にありました。メッセージは "file length exceeded"でした。私はfilemtimeステートメントでCronジョブが終了したことを知っていました。私はそのステートメントの前後に電子メールを送ってきました。 「アフター」メールは決して到着しなかった。

ファイルにfile_existsチェックを挿入して、Cronジョブを修正しました。しかし、それは必要ではなかったはずです。私はまだ私が使用しているホスティングサーバーで何が変更されたのか分からない。同じ日にいくつかの他のCronジョブが失敗し始めました。私はまだ彼らがfilemtimeと関係があるかどうかはわかりません。

2

用途:

Smarty::muteExpectedErrors(); 

読むthisthis

関連する問題