2

php が flock() を使用してファイルへの排他ロックを取得し、pcntl_fork を使用して 2 つのプロセスに分割すると、両方のプロセスが同じ排他ロックを持つように見えます。つまり、さらに flock($fd, LOCK_EX ) は、そのファイル ハンドルに対して true を返します。

ただし、flock を使用するポイントは、2 つのプロセスが同時に同じファイルに書き込むのを防ぐことです。では、PHP はこのケースをどのように処理するのでしょうか。どういうわけか両方とも排他ロックを持っている 2 つのプロセスが競合することを許可しますか? あるプロセスが他のプロセスがロックを解除したかどうかを検出する方法は (新しいファイル ハンドラーを作成せずに) ありますか?

これは主に学術的な好奇心です。これは、新しいファイル ハンドラーを作成するか、IPC を使用して他のプロセスに通知する最後の手段として処理できることはわかっていますが、ロックの重複を検出する方法が群れシステムに組み込まれているのだろうか?

4

1 に答える 1

1

flockファイル ハンドル レベル (PHP 用語では、レベルによって返されるファイル ハンドル リソースfopen) で動作するため、fork すると、両方のプロセスが同じリソースのコピーを持っているため、両方のプロセスがロックされます。

ポイントはflock、ファイルハンドルを別のプロセスと共有しない限り、同時アクセスを防ぐことです。共有は自発的な操作であるため、実際的な問題はありません。共有する場合は、ロックの排他性が維持されるように追加の手配を行う必要があります。

アカデミック レベルでは、フォーク後にカーネルがロックの重複を検出することは可能ですが (結局のところ、カーネルは、ロック エントリが関連付けられている開いているファイル記述子があることを認識しています)、実装によって何かを行うことは不可能になります。それ。

于 2014-04-07T08:57:25.930 に答える