ファイルのロックについての質問です
created: 2003-06-09 17:58 | modified: 2003-06-12 11:19 | reply: 5
[363] ファイルのロックについての質問です
user: たろう | created: 2003-06-09 17:58
はじめまして、PHP一年生です。
現在PHPを学んでいる最中です。
現在ファイルのロックについて質問します。
ファイルをオープンする際に、そのファイルが既に開いているかどうかでロックをかけれないかなぁと考えています。
どなたか参考にしたらいいよというものがありましたら教えてください。
よろしくお願いします。
PHPのVerは4.1.2です。
現在PHPを学んでいる最中です。
現在ファイルのロックについて質問します。
ファイルをオープンする際に、そのファイルが既に開いているかどうかでロックをかけれないかなぁと考えています。
どなたか参考にしたらいいよというものがありましたら教えてください。
よろしくお願いします。
PHPのVerは4.1.2です。
[365] >ファイルのロックについての質問
>ファイルが既に開いているかどうかでロックをかける
次のように開けない場合は処理を中止するようにすればいいと思いますよ。
$fp = @fopen("./log.txt", 'r') or exit('ファイルが開けませんでした、残念!');
flock($fp, LOCK_EX); // ロック開始
・・・中間処理・・・
flock($fp, LOCK_UN); // ロック解除
fclose($fp);
しかし、上記のようにロック用としてflock関数を使うことはあまりお勧めできません。
私を含め、初心者プログラマにはかなり面倒な処理が必要なロック方法だからです。
本当は上記のようなflockの使い方ではいろいろと問題点があります(例えば、バッファを書き出してないとか)。
代わりのロック方法として、mkdir関数を使ったロックをお勧めします。
これは好みの範囲に対してロックがかけられるので便利です。
次のように開けない場合は処理を中止するようにすればいいと思いますよ。
$fp = @fopen("./log.txt", 'r') or exit('ファイルが開けませんでした、残念!');
flock($fp, LOCK_EX); // ロック開始
・・・中間処理・・・
flock($fp, LOCK_UN); // ロック解除
fclose($fp);
しかし、上記のようにロック用としてflock関数を使うことはあまりお勧めできません。
私を含め、初心者プログラマにはかなり面倒な処理が必要なロック方法だからです。
本当は上記のようなflockの使い方ではいろいろと問題点があります(例えば、バッファを書き出してないとか)。
代わりのロック方法として、mkdir関数を使ったロックをお勧めします。
これは好みの範囲に対してロックがかけられるので便利です。
[366] Re:ありがとございます
user: たろう | created: 2003-06-11 14:00
ご指摘ありがとうございます。このBBSに投稿した後にいろいろと本をみてしらべた結果、ロックする際にはご指摘のようなflock関数を使えばいいとかいてありました。しかし方法ではろうやらロックがかかっていないようでした。
やっぱりflockはさけてmkdir関数を使ったほうがよいのでしょうか。?
やっぱりflockはさけてmkdir関数を使ったほうがよいのでしょうか。?
[367] 無理にとはいいませんが
無理にflock関数を使うことをさけることもありませんが、
mkdir関数を使った方がロックするのが非常に簡単なのでお勧めだというわけです。
他にもsymlink関数やrename関数を使っても同じようにロックできます。
mkdir関数を使った方がロックするのが非常に簡単なのでお勧めだというわけです。
他にもsymlink関数やrename関数を使っても同じようにロックできます。
[369] おもしろそうなネタなのでいっちょかみ(^^;;
付け加えて,
$fp = @fopen("./log.txt", 'r') or exit('ファイルが開けませんでした、残念!');
これは読み込み専用ですから,ファイルロックの必要ないですね.
例えばファイル全部を読み込むには,
$fp = fopen ($fale, "r");
$str = fread ($fp, filesize($fale));
fclose ($fp);
これで済むのでロックは必要ないです.
問題になるのは「書込時」で特に「w」モードですね.
どのようなロックであろうと
$fp = fopen("./log.txt", 'w')
この瞬間が最も危険です.未ロック状態でファイルは「空」の状態です.
ここで同時アクセス的に別のプロセスがファイルを読み込んでも「真っ白」です.0バイト.
or exit('ファイルが開けませんでした、残念!');
となるのは何の問題もありません.ファイルになんら影響与えてませんし.
エラーを吐いてユーザビリティーに欠ける程度です.
本来ならここをループさせるかして「待機状態」にしておけば無用なエラーも減るような気がします.
書込処理をするならこの前段階で
$fp = fopen("./log.txt", 'r')
で読み込み,テンポラリファイルに保存するとかの安全策が必要かと.
PHPのファイルバッファ関数にはバグがあるようなので,別に書き出しておくのがよろしいかと思われます.
その後,「書込処理」するのにflockなりmkdirなり併用するなり手を尽くしてロックされればよろしいと思います.
$fp = @fopen("./log.txt", 'r') or exit('ファイルが開けませんでした、残念!');
これは読み込み専用ですから,ファイルロックの必要ないですね.
例えばファイル全部を読み込むには,
$fp = fopen ($fale, "r");
$str = fread ($fp, filesize($fale));
fclose ($fp);
これで済むのでロックは必要ないです.
問題になるのは「書込時」で特に「w」モードですね.
どのようなロックであろうと
$fp = fopen("./log.txt", 'w')
この瞬間が最も危険です.未ロック状態でファイルは「空」の状態です.
ここで同時アクセス的に別のプロセスがファイルを読み込んでも「真っ白」です.0バイト.
or exit('ファイルが開けませんでした、残念!');
となるのは何の問題もありません.ファイルになんら影響与えてませんし.
エラーを吐いてユーザビリティーに欠ける程度です.
本来ならここをループさせるかして「待機状態」にしておけば無用なエラーも減るような気がします.
書込処理をするならこの前段階で
$fp = fopen("./log.txt", 'r')
で読み込み,テンポラリファイルに保存するとかの安全策が必要かと.
PHPのファイルバッファ関数にはバグがあるようなので,別に書き出しておくのがよろしいかと思われます.
その後,「書込処理」するのにflockなりmkdirなり併用するなり手を尽くしてロックされればよろしいと思います.
[370] あ、するどいつっこみですね(^^)
またまた、いいかげんに返信したところへするどいつっこみありがとうございます。
すいません、たろうさん。読み込み時には共有ロックである、
flock($fp, LOCK_SH);
を使ってください。
>unadonさんへ質問
ロックをいいかげんに解釈しているのですが、
読み込み時に共有ロックなしで読み込んでいる場合、
他のプロセスによって書き込まれる可能性はどうなのでしょうか?
これでもやはりロックは必要ないのでしょうか?
すいません、たろうさん。読み込み時には共有ロックである、
flock($fp, LOCK_SH);
を使ってください。
>unadonさんへ質問
ロックをいいかげんに解釈しているのですが、
読み込み時に共有ロックなしで読み込んでいる場合、
他のプロセスによって書き込まれる可能性はどうなのでしょうか?
これでもやはりロックは必要ないのでしょうか?