bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
ハンドル
ファイル システム ポインターは、通常は fopen() によって作成されるリソースです。
operation は次の値のいずれかになります:
1. LOCK_SH は共有ロックを取得します (プログラムの読み取り)。
2. LOCK_EX 排他ロックを取得します (プログラムを書き込みます。)
3. LOCK_UN ロックを解放します (共有または排他)。
4. ロック時に flock() をブロックしたくない場合は、LOCK_NB です ( Windows)
wouldblock
ロックがブロックされる場合 (EWOULDBLOCK エラー コードの場合)、オプションの 3 番目のパラメーターは TRUE に設定されます (Windows ではサポートされていません)
戻り値
成功した場合は TRUE、失敗した場合は TRUE。 FALSE を返します。
PHP 5.3.2 より前では、ロックは fclose() によっても解放されます (スクリプト終了後に自動的に呼び出されます)。現在は手動でロックを解除する必要があります (flock ($fp, LOCK_UN); // ロックを解放します)。
マルチスレッド サーバー API (ISAPI など) を使用する場合、ファイルは他の並列スレッドによって処理される可能性があるため、ファイルを保護するために flock() に依存できない場合があります。 ?)
eg:1
file_get_contents と file は、次の例のように、空ではないファイルを読み取るときに空を返すことがあります
code1 のロック中、code2 はすべて空を出力し、code3 は code1 が解放するのを待ちます。ロックして取得したコンテンツを返します
code1
コード2
コード3
リーリー
例:2
ローカル操作の結果は以下と矛盾しています。 LOCK_SH (???) のときに書き込むことができます
以下はマニュアルの例です
write 関数がなぜ私を返すのかを理解するのに長い時間を費やしました。 「0」、基本的なファイルを開いて書き込みます。
LOCK_SH を使用してから何かを書き込むと、それが機能しないことがわかりました:
例:3
複数のプロセスとスレッドが同時にファイルを読み書きする問題を解決するコードを作成します:
PHP にはマルチスレッドの概念がありませんが、マルチスレッドをシミュレートするために「不完全な」メソッドを使用することはできます。 。
簡単に言うとキュー処理です。これは、ファイルをロックおよびロック解除することによって実現されます。ユーザーがファイルを操作すると、
ファイルはロックされ、他のユーザーは待つことしかできません。これは確かに完璧ではありませんが、要件が低い一部のアプリケーションにも対応できます