2012-05-29 8 views
5

フラットファイルの読み込みの同時性はほとんど無制限です(私が間違っていれば私を修正してください)。書き込みの並行性はどのようになっていますか?私たちは、同時の訪問者を持っているので\nログをフラットファイルに書き込むためのLOCKの仕組みは?

fopen(); // in append mode 
fwrite(); 
fclose(); 

、で終わったアクセスディテールの行を追加するとPHPで簡単なアクセスログ(訪問のための)書き込みを考えてみましょうどのようにシステム(wbserver/PHPのユーザーで1人のユーザー)ビューのログを同時に書き込みますか?

私の混乱は:機能file_put_contents()(上記の3つの機能のラッパーです)はロックするオプションがあります(LOCK_EX)?このロックオプションを使用すると有益でしょうか?どのようにログの書き込みに影響を与えますか?

更新日:私の質問は、元々の動作/ログのファイルへの書き込みにどのように影響しますか。私の質問はLOCKです。私はfile_put_contentsfwriteを比較しません。私の質問でさえもPHPに限定されるものではありません。問題は、書き込み処理中にファイルをロックすることです。

+0

'ますfile_put_contents()'ロックするためのオプションを持っている、[手動](http://php.net/manual/en/function.file-put-contents.php)を確認。 – yannis

+0

@ YannisRizos元の質問で引用したように、私は 'file_put_contents'に' LOCK_EX'があることを知っています。私の質問は、アクセスログの書き込みにどのように影響するかです。 – Googlebot

+0

はい、そうですね、私のコメントは質問の第2版に対するものでした。悪い編集、それ。 – yannis

答えて

3

file_put_contents()にはロックオプションがありますが、私の意見ではflock()を代わりに使用してください。マニュアルから

利用可能なフラグ

FILE_USE_INCLUDE_PATH includeディレクトリにあるファイル名の
検索。 の情報については、include_pathを参照してください。

FILE_APPEND ファイルfilenameが既に存在する場合は、上書きする代わりにファイルにデータを追加します。

LOCK_EX 書き込みに進むうちに排他ロックを取得します。共有ロック(リーダ)を取得する

LOCK_SH

flock()を使用して、他の方法を使用することを可能にします。
LOCK_EX 排他ロック(ライター)を取得する。
ロックを解放するLOCK_UN(共有または を除く)。

はこちらをご覧ください:http://php.net/manual/en/function.flock.phpとここに:http://php.net/manual/en/function.file-put-contents.php

0

が警告され、アクセスログのファイルロックは簡単に競合状態を導入できる環境です。おそらく別の方法を検討するでしょうか?おそらくデータベースにロギングしますか?うまく設計されたシステムでは、並列プロセスで同時にログを開いて書き込もうとするのは非常に簡単です。

多分モノログを見ますか?非同期ロギングのためのいくつかのロギングハンドラがあります。これは、アクセスロギングとは何かには理想的です。

https://github.com/Seldaek/monolog

+0

「モノログ」について知っておきたいこと。これはカスタムアクセスログであり、システムのものではありません。セッション、クッキー、メンバーログインなどの情報を含むことができます。さらに、私の質問は一般的にディスクに書き込むことです。 – Googlebot

+0

@Aliあなたは何かに夢中になってしまったら、非常に注意する必要があります。データをロギングする頻度が高ければ高いほど、コードがログに追加され、ファイルがロックされてログに記録されなくなる可能性が高くなります。このような状況では、SSD(高速書き込み速度、サーバーハードウェアとしての可能性はほとんどない)、RAMディスク(高速書き込み、不安定、電源が切れ、データが消えている)、またはディスクを回転させて指を横切り、ログにファイルロックされていないものがないことを願ってください。 – damianb

関連する問題