この記事では、PHP が flock を使用してファイル ロックを実装する方法の例について説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです:
公式ドキュメントでの flock の説明は次のとおりです: flock() を使用すると、任意のプラットフォーム (ほとんどの Unix 派生製品や Windows も含む) で使用できる単純な読み取り/書き込みモデルを実装できます。ロックがブロックされる場合 (EWOULDBLOCK エラー コードの場合)、オプションの 3 番目のパラメータを TRUE に設定します。ロック操作は fclose() によって解放することもできます (コードの実行が完了すると自動的に呼び出されます)。
簡単に言うと、ファイルをロックして、複数のプロセスによるファイルへのアクセスを制限し、競合を防ぐことです。例:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$file = fopen("test.txt","w+"); if (flock($file,LOCK_EX)) { fwrite($file,"何かを書きます"); flock($file,LOCK_UN); } その他 { echo "ファイルのロック中にエラーが発生しました!"; } fclose($file); ?> |
説明:
1. このコードの意味は、ファイル test.txt を読み書きモードで開くことです。ユーザーが php ページを呼び出すと、test.txt ファイルが操作され、flock($file, LOCK_EX) コードが実行されます。つまり、test.txt ファイルは排他的にロックされます (ファイルはこのユーザーのみが読み書きできます)。その後、他の新しいユーザーがファイルにアクセスしようとしても、前者がファイルを閉じるまでブロックされます (ロックを解除します)。
2. コードを flock($file,LOCK_EX+LOCK_NB) に変更すると、ロック時に直接エラーが返されることになります。その後、新しいユーザーがファイルにアクセスすると、「ファイルのロック中にエラーが発生しました!」と出力されます。
3. この関数の構文は flock(file, lock, block) で、file は必須です。開いているファイルをロックまたは解放するように指定します。ロックが必要です。使用するロックのタイプを指定します。ブロックはオプションです。 1 または true に設定すると、ロック中に他のプロセスがブロックされます。例: 複数のプロセスが同じファイルを同時に正常に書き込むことができるようにするための PHP コードを記述してください
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
関数 writeData($path, $mode,$data) { $fp = fopen($path, $mode); $再試行 = 0; $max_retries = 100; する{ if ($retries > 0) { usleep(rand(1, 10000)); } $再試行 += 1; }while (!flock($fp, LOCK_EX) および $retries if ($retries == $max_retries) { false を返す; } fwrite($fp, "$datan"); flock($fp, LOCK_UN); fclose($fp); true を返す; }
|