3

私のワークフローはとてもシンプルです:

  1. ファイルを削除します
  2. 電話するclearstatcache()
  3. 新しいファイルを保存します
  4. 電話するclearstatcache()

それでも、最後に、たとえば10秒後にリフレッシュしたときに戻ることを決定する前に、しばらくis_file()戻ります。falsetrue

キャッシュの問題のようですね。

これが私のコードの一部です:

// step 1
$path = 'file_to_delete.jpg';
unlink($path);

// is_file($path) returns false here -- normal behavior
// step 2
clearstatcache();

// step 3 -- some stuff going on on an uploaded image, that leads to:
imagejpeg($imagetosave, $path, 80);

// step 4
clearstatcache();

// is_file() returns false, i have to wait a couple of seconds before it starts returning true

ご協力ありがとうございました!

編集:

私が持っていたすべての答えを考えると、問題はclearstatcache().

ただし、ファイルを上書きすると(したがって、既存のステータスは変更されません)、is_file()良い結果が返されます。しかし、その既存のステータスが実際に変化すると、問題が発生します。エラーがから来ていなかったら変clearstatcache()ですよね?(または実際にこのキャッシュに関連するもの)

4

1 に答える 1

2

@hakre に同意します。作成/削除の結果を確認してください。

Rasmus自身も推奨しています:

[2011-03-31 08:34 UTC] rasmus@php.net

皆さんは、統計キャッシュがリクエストごとであることを認識していますよね? A. stat を実行し、B. そのリクエストでそれを作成または削除した場合にのみ、file_exists() 呼び出しの前に stat キャッシュをクリアする必要があります。その場合、作成/削除の成功ステータスによってファイルが存在するかどうかがわかるため、再度 stat する必要はありません。おそらく、長時間実行されるデーモンなどでは、これはより大きな問題になりますが、典型的な Web リクエストでは、統計キャッシュは通常、数十のシステム コールを節約します。

あなたが本当に を使用することを主張しているのであればclearstatcache()、私の頭に浮かぶ唯一のこと (書き込みキャッシュ以外) は、何千ものファイルを含む非常に巨大なアップロード フォルダーがあることです。

1 つのフォルダーに非常に多くのファイルがあると、再記述が確実に遅くなります。

その場合は、複数のフォルダーを作成して、アップロード ファイル名の最初の文字 ( 、 など) ごとに 1 つのフォルダーを作成するなどして、統計パフォーマンスを得るためにファイルの数を減らしてみてupload/a/くださいupload/b/

于 2011-12-05T09:49:40.310 に答える