仮想名前付きリソースの PHP リクエスト間で、通常またはエラーによりスクリプトが終了したときにロックが解除される、迅速かつ効率的なシリアライゼーション メカニズムを実装したいと考えています。私は過去に eaccelerator_lock() とそれに対応する eaccelerator_unlock() を持っていましたが、eaccelerator はもうその機能を実装していません。私がやりたいことは次のようなものです:
lock_function("my-named-resource");
..
my_might_abort_abruptly_function();
..
unlock_function("my-named-resource");
まったく同じパラメータで lock_function() を呼び出す他の PHP スクリプトは、このスクリプトが unlock_function() を呼び出すか中止するまでブロックする必要があります。リソース名は処理前には不明 (生成された文字列) であり、小さなセットに制限することはできません (つまり、ロック メカニズムは適切な粒度を持つ必要があります)。catch が呼び出されない状況があるため、try/catch コードは避けたいと思います。また、(ネイティブ OS のブロックではなく) 手動の usleep() スピンに依存するメカニズムは避ける必要があります。
私のものは、サーバーで実行されている唯一のアプリケーションです。システムは、PHP 5.3.3、Apache 2.2.15 を搭載した CentOS 6 Linux であり、私はそれを完全に制御できます。
次の代替案を検討しました。
セマフォ: PHP ではうまく実装されていません。Linux では数千の配列を使用できますが、PHP では ID ごとに 1 つしか割り当てられません。
flock() : 私のリソースは仮想であり、 flock() は全体/実際の/既存のファイルのみをロックします。何千ものファイルを事前に作成し、ハッシュ関数でロックするファイルを 1 つ選択する必要があります。粒度は、ファイルの数によって異なります。
dio_fcntl() : 単一のファイルと fcntl(F_SETLK) で flock() のアイデアを再現しようとすることができました。これには、多くのファイルを必要とせずに適切な粒度という利点があります。ファイルの長さが 0 バイトの場合もあります。(F_SETLK は、ファイルの終わりを超えてロックできます)。ああ!問題は、ドキュメントのどこにも、スクリプトの終了時に dio_fcntl() がリソースを解放するとは書かれていないことです。
database lock : データベースに依存しすぎますが、キー ロックの粒度が適切なデータベースにキー ロックを実装できます。それもそれほど速くはないでしょう。
独自の PHP 拡張機能を実装します。そのパスは避けたいと思います。
事は、私はどこかの誰かが私より前にこれを考えていたはずだと思う. 何が良い選択でしょうか?私が見ていない別の解決策はありますか?
前もって感謝します。ギレルモ。