1

データをテキストファイルにキャッシュするかなり基本的なPHPスクリプトがあります。スクリプトの実行中の2つのインスタンスが同時にファイルに書き込むのを防ぐソリューションを考え出す必要があります。PHP flock関数を調べましたが、PHPマニュアル(http://php.net/manual/en/function.flock.php)には1つの大きな制限が記載されています。

一部のオペレーティングシステムでは、flock()がプロセスレベルで実装されています。ISAPIのようなマルチスレッドサーバーAPIを使用する場合、同じサーバーインスタンスの並列スレッドで実行されている他のPHPスクリプトからファイルを保護するためにflock()に依存できない場合があります。

この警告に関して、誰かが答えてくれることを期待している2つの質問があります。まず、flockの実装がプロセスレベルで行われているかどうかを確認するにはどうすればよいですか?ところで、私はcPanelでCentOSを実行しています。

第二に、私の実装がプロセスレベルである場合、それは私のスクリプトの1つの実行中のインスタンスが、同じスクリプトの別の実行中のインスタンスによって行われたロックを認識しないことを意味しますか?または、スクリプトインスタンスは、個別のプロセスではなく、個別のスレッドで実行されますか?これについての説明は大歓迎です。

ありがとう。

4

1 に答える 1

0

唯一の一般的なケースは、ある種のスレッド化された(フォークではない)npmを使用してApacheを実行することです。PHPスレッドを実行していない場合の99%..これは比較的安全な仮定です。

それとは別に、ロックを回避することを試みる価値があるかもしれません。

あなたが抱えている最大の問題は、2つのプロセスが同時に書き込みを行っているか、1つのプロセスが完全に生成されていないときにキャッシュを読み取る可能性があることです。これを回避する最も簡単な方法は、PHPスクリプトに一時的な場所の別のファイルにキャッシュを生成させることです。ファイルが書き込まれたら、ファイルを所定の位置に移動します(rename()を使用)。同じマウントで発生する場合、ファイルの移動はアトミックであることが保証されます。

于 2013-03-01T01:33:58.630 に答える