私は同じファイルに書き込む2つの異なるPHPファイルを持っています。各PHPスクリプトは、2つの異なるHTMLページのユーザーアクションによって呼び出されます。 2つのPHPファイルを呼び出すことは可能ですが、両方のPHPファイルが同時にファイルに書き込もうとしますか?はいの場合はどうなりますか?また、あるPHP関数が他のPHP関数よりも重要ではないので、PHPのいずれかが正常に機能しなくなる(ファイル書き込みは失敗し、他のPHPはファイルに書き込むことができます)。PHP同時ファイル書き込み
答えて
これに対処する通常の方法は、ロックするために、両方のスクリプトがflock()
を使用することです:
$f = fopen('some_file', 'a');
flock($f, LOCK_EX);
fwrite($f, "some_line\n");
flock($f, LOCK_UN);
fclose($f);
これは、スクリプトがそれに書き込む前にファイルを成し遂げるためにお互いを待つことになります。あなたが好きなら、「あまり重要」スクリプトが実行できます。
$f = fopen('some_file', 'a');
if(flock($f, LOCK_EX | LOCK_NB)) {
fwrite($f, "some_line\n");
flock($f, LOCK_UN);
}
fclose($f);
それが何かは、ファイルとビジーであることを発見した場合、それだけで何もしませんように。
flockの機能を見てください。
FYI:群がるだけの* nix上で動作しますのでご注意くださいWindowsの
にPHPのドキュメントから: "flock()は、ほぼすべてのプラットフォーム(ほとんどのUnix派生物やWindowsを含む)で使用できる単純なリーダー/ライターモデルを実行することを可能にします。 – cdmckay
システムコールとしての 'flock'はWindowsでは実装されていませんが、これは' flock' PHP関数で抽象化されています。 – Piskvor
ええ、私は誤って話しました。これは私がWindowsで利用できないと言ったときに考えていたバグです:http://bugs.php.net/bug.php?id = 39138(私はWindowsのローカルデベロッパーサーバーに必要な時にこれに遭遇し、それ以来Windowsマシンでそれを避けていた)。冷静に、戦い続けよ。 – xentek
利用できません:ファイルのリソースハンドルが削除された閉じられたときにPHP 5.3.2、自動ロック解除のよう
。 ロック解除は常に手動で行う必要があります。
更新下位互換性のコードは次のとおりです。
if (($fp = fopen('locked_file', 'ab')) !== FALSE) {
if (flock($fp, LOCK_EX) === TRUE) {
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN);
}
fclose($fp);
}
つまりあなたはfcloseを()はもうそれをしないため、明示的に群れ(..、LOCK_UN)を呼び出す必要があります。
ファイルが開かれている場合、posixはアブストラクトになります。にはが追加されます。つまり、ファイルに複数のスレッドを追加するだけで、行が破損することはありません。
私は十数本のスレッドと数十万本でこれをテストしました。いずれの線も壊れていない。
バッファサイズが超過する可能性があるため、これは1kBを超える文字列では機能しない可能性があります。
これは、posixに準拠していないウィンドウでは機能しない可能性があります。
- 1. 同時ファイル書き込みPHP
- 2. 同時ファイル書き込み
- 3. zipファイルへの同時書き込み
- 4. 同時ファイル書き込みの処理
- 5. phpファイルの書き込み時にキャッチ
- 6. 同時読み込み書き込み
- 7. Javaでの同時読み込み/書き込みファイル
- 8. 2つのスレッドによるファイルの同時読み込み/書き込み
- 9. Firebaseデータベースの同時データ書き込み
- 10. DynamoDBの同時書き込み
- 11. Golang:チャネルと同時書き込み
- 12. 2人のユーザーが同時にファイルに書き込みますか? (PHP/file_put_contents)
- 13. SQLiteの同時読み込みと書き込み
- 14. MongoDBでの同時読み込み/書き込み
- 15. Android内蔵ストレージの読み込み/書き込み同時に、
- 16. 同時読み込みと書き込みの問題
- 17. ADLAへの同時読み込み/書き込み
- 18. カサンドラ同時読み込みと書き込み
- 19. Pythonマルチプロセッシングを使ったファイルの同時書き込み
- 20. 画面への印刷とファイルへの同時書き込み
- 21. JavaScriptのファイルへの同時書き込みの処理
- 22. 複数ファイルへの同時書き込み
- 23. ajaxリクエストからのファイルへの同時書き込み
- 24. Javaの同じファイルへの読み込みと書き込み
- 25. phpファイルから同時に読み書きする
- 26. NetCDFファイルの書き込み時間
- 27. のファイルの書き込みが時間
- 28. PHPファイル書き込み - 毎回のエラーメッセージ
- 29. PHP:ファイル書き込みの問題
- 30. PHPでのスレッドセーフなファイル書き込み
私が探していたもの!それは簡単だったので、PHPのドキュメントをもっと調べてみるべきでした。 –
関数がアトミックではないので、flock()を使用して注意してください。 – arul
2つの正確な同時書き込みでファイルの内容が空にならないようにするもう1つのヒント。フラットファイルのビジターカウンターを持つ人気の高いページで、それは私にはたくさん起こった。解決策:fwrite()の前に20〜80 msのランダムな遅延を追加しました。これは、現在までにビジター数がはるかに多いという問題を修正しました。 –