スレッド表示 | フラット表示〕 全トピック 920 件中 851 番目 次≫ ≪前

ファイルのロックについての質問です

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です。
reply: 365 返信 編集 削除

[365] >ファイルのロックについての質問

user: yagi ホームページ | created: 2003-06-11 11:45
>ファイルが既に開いているかどうかでロックをかける

次のように開けない場合は処理を中止するようにすればいいと思いますよ。

$fp = @fopen("./log.txt", 'r') or exit('ファイルが開けませんでした、残念!');
flock($fp, LOCK_EX); // ロック開始

・・・中間処理・・・

flock($fp, LOCK_UN); // ロック解除
fclose($fp);

しかし、上記のようにロック用としてflock関数を使うことはあまりお勧めできません。
私を含め、初心者プログラマにはかなり面倒な処理が必要なロック方法だからです。
本当は上記のようなflockの使い方ではいろいろと問題点があります(例えば、バッファを書き出してないとか)。

代わりのロック方法として、mkdir関数を使ったロックをお勧めします。
これは好みの範囲に対してロックがかけられるので便利です。
Parent: 363  reply: 366 369 返信 編集 削除

[366] Re:ありがとございます

user: たろう | created: 2003-06-11 14:00
ご指摘ありがとうございます。このBBSに投稿した後にいろいろと本をみてしらべた結果、ロックする際にはご指摘のようなflock関数を使えばいいとかいてありました。しかし方法ではろうやらロックがかかっていないようでした。
やっぱりflockはさけてmkdir関数を使ったほうがよいのでしょうか。?
Parent: 365  reply: 367 返信 編集 削除

[367] 無理にとはいいませんが

user: yagi ホームページ | created: 2003-06-11 18:03
無理にflock関数を使うことをさけることもありませんが、
mkdir関数を使った方がロックするのが非常に簡単なのでお勧めだというわけです。
他にもsymlink関数やrename関数を使っても同じようにロックできます。
Parent: 366  返信 編集 削除

[369] おもしろそうなネタなのでいっちょかみ(^^;;

user: unadon ホームページ | created: 2003-06-12 04:45
付け加えて,
$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なり併用するなり手を尽くしてロックされればよろしいと思います.
Parent: 365  reply: 370 返信 編集 削除

[370] あ、するどいつっこみですね(^^)

user: yagi ホームページ | created: 2003-06-12 11:19
またまた、いいかげんに返信したところへするどいつっこみありがとうございます。

すいません、たろうさん。読み込み時には共有ロックである、

flock($fp, LOCK_SH);

を使ってください。

>unadonさんへ質問

ロックをいいかげんに解釈しているのですが、
読み込み時に共有ロックなしで読み込んでいる場合、
他のプロセスによって書き込まれる可能性はどうなのでしょうか?
これでもやはりロックは必要ないのでしょうか?
Parent: 369  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 851 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑