0

私は単純なキャッシングシステムを持っています

if (file_exists($cache)) {
echo file_get_contents($cache);
// if coming here when $cache is deleting, then nothing to display
}
else {
// PHP process
}

古いキャッシュファイルは定期的に削除します。たとえば、1時間後にすべてのキャッシュを削除します。if statementこのプロセスは非常に高速ですが、とプロセスの間でキャッシュファイルを削除できると思いfile_get_contentsます。

つまりif statement、キャッシュファイルの存在を確認すると、存在します。しかしfile_get_contents、それをキャッチしようとすると、それはもう存在しません(同時キャッシュ削除プロセスによって削除されます)。

file_get_contents読み取りプロセス中に削除プロセスが実行されないように、ファイルをロックします。if statementただし、がPHPプロセスを最初の条件(の開始前)に送信するときに、ファイルを削除できますfile_get_contents

これを回避するためのアプローチはありますか?キャッシュ削除システムは違いますか?

注:このイベントをキャッチする可能性は非常に低いため、実際的な問題は発生しませんでしたが、論理的には可能であり、高負荷で発生するはずです。

4

2 に答える 2

0

失敗するとfile_get_contentsfalseを返すので、これはどうでしょうか。

if (($output = file_get_contents($filename)) === false){
  // Do the processing.
  $output = 'Generated content';
  // Save cache file
  file_put_contents($filename, $output);
}
echo $output;

ちなみにfpassthru、特に大きなファイルの場合は、メモリ効率の高い、の使用を検討することをお勧めします。大きなファイル(> 100 MB)でfile_get_contentsを使用すると、おそらく問題が発生します(構成によって異なります)。

<?php
$fp = @fopen($filename, 'rb');
if ($fp === false){
  // Generate output
} else {
  fpassthru($fp);
}
于 2012-11-07T17:58:36.900 に答える
0

幸いにもエラーが発生した場合は、次のようにすばやくベイクできますfile_get_contentsFALSE

if (FALSE !== ($buffer = file_get_contents())) {
    echo $buffer;
    return;
}
// PHP process

または同様。@存在しないファイルに関する警告を非表示にするように演算子を配置することを考えると、これは少し迅速で汚い方法です。

if (FALSE !== ($buffer = @file_get_contents())) {

もう1つの方法はロックすることですが、ロックした場合にファイルを削除しないようにキャッシュを削除できない可能性があります。

次に、左は自分のキャッシュをストールすることです。つまり、PHPでファイル作成時間を読み取り、5分未満であることを確認してから、ファイル削除処理(5分が例示)を行うと、ファイルがすでに古く、新しいコンテンツに置き換えられていることがわかります。その後、ファイルを再作成します。それ以外の場合は、ファイルを読み込みます。これは、andの代わりにを使用するよりもおそらく優れていreadfileます。file_get_contentsecho

于 2012-11-07T17:58:48.713 に答える