13

私は使用しています:

file_put_contents("peopleList.txt", $person, FILE_APPEND | LOCK_EX);

ファイルの最後に書き込み、他の人 (またはスクリプト) が同じファイルに同時に書き込みを行っていないことを確認します。

PHPのマニュアルには、失敗すると偽の値が返されると書かれています。

ファイルのロックを取得できない場合、失敗するか、可能になるまで試行し続けますか? ロックを取得できないときに失敗した場合、データが確実に書き込まれるようにするための最良の方法は何でしょうか?

おそらく、関数が false を返さなくなるまで while ループでループする (クリンジ) か、単純にユーザー (Web サイトの訪問者) に再試行を要求する何らかの GUI を提供しますか?

4

2 に答える 2

4

実際、私の以前の回答は少し時代遅れでした。要求されたロックが取得さflock()れるまでブロックします:

PHP は、推奨される方法で完全なファイルをロックする移植可能な方法をサポートしています (つまり、アクセスするすべてのプログラムは、同じ方法でロックする必要があります。そうしないと、機能しません)。デフォルトでは、この関数は要求されたロックが取得されるまでブロックされます。これは、以下に説明する LOCK_NB オプションを使用して (Windows 以外のプラットフォームで) 制御できます。

それを利用しているのでfile_get_contents()、同じだと思います。ただし、オペレーティング システムによって異なることに注意してください。

もう少し重要なことは、NB が既に説明した理由により、説明したシナリオでファイルをロックする必要がないことです。CLI SAPI を使用していない限り、ファイルのロックについて心配する必要がある一般的なシナリオは考えられません。

于 2012-01-19T14:50:36.727 に答える
0

関数がファイルのロックを取得できなかった場合は、使用できるエラーが返されます。

if ($result === false) { print "failed to lock"; }

数回ロックを取得しようとする場合は、ループを使用してファイルへの書き込みを試行し続けます。

于 2012-01-25T16:25:25.307 に答える