• ベストアンサー

ファイルの破壊について

2人以上の方が同時にファイルの書き込みをすると ログファイルが白紙になったりエラーが起こってしまうらしく、それを防ぐために以下のような書式が open(OUT, "> file.txt"); flock(OUT, 2); print OUT ".......\n"; close(OUT); # closeすると自動的にアンロックされる とほほのWWW入門で記載されていたんですが、このロック方法で本当に大丈夫なのでしょうか とほほさんの解説があまりにも漠然としていて信じがたいんです。 詳しい方、上の方法でも十分かどうかご教授よろしくお願いします。 http://www.tohoho-web.com/wwwperl3.htm#Lock

  • Perl
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • kobold
  • ベストアンサー率62% (20/32)
回答No.1

私もそのようにしていましたが、特に問題ありませんでした HPのアクセスカウンターで現在の数字を保存させるのに 使ったときですが、flockをしないと、 何回かに一回、壊れてしまいましたが、 flockをしておけば、今のところ壊れたということはありません そんなに頻繁にアクセスされるサイトではないので、 もっと頻繁になったときの保証はできませんが

is_may
質問者

補足

ありがとうございます。 もうひとつ質問ですが、 flock(OUT,**); の**の部分には何を入れればいいのでしょうか サンプルでは「2」が入ってますけど よろしくお願いします

その他の回答 (1)

  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.2

他の部分の記述方法、動作環境にもよりますが、 上記内容では不十分な場合があります。 たとえば以下のような場合 問題が起こる可能性があります。 1、プロセスAのopenによりファイル内容が削除される。 2、プロセスBが空白のファイルを読み込む。 3、プロセスAがflockを実行。 詳しくは参考URLをどうぞ。

参考URL:
http://homepage1.nifty.com/glass/tom_neko/web/web_04.html
is_may
質問者

お礼

難しそうですね^^; mkdirを使ってみようと思います。 ありがとうございました。

関連するQ&A

  • flockについて

    http://www.freespace.jp/phpstudy.php4 のサイト様を拝見したり、フリーで配布されているスクリプトを見ると、書き込むファイルに対して、 $fp = fopen('bbs.log', 'r+'); flock($fp, LOCK_EX); … とやっていると思うのですが、perl記述のcgiで掲示板を作成したときは、書き込むファイルとは別にロック用のファイルを用意し、(perl記述です) open(LOCK,"+<$lockfile"); flock(LOCK,2); open(IN,"$logfile"); .... close(IN,"$logfile"); open(OUT,"$logfile"); .... close(OUT,">$logfile"); としていました。(書き込むファイルが2つあったのでこのような方法をとってました) そこでphpでも同じ方法は使えるのでしょうか? $fp = fopen('bbs.log', 'r+'); flock($fp, LOCK_EX); … の方法を使おうと思っていたのですが、最初にログファイルを読み込むとき、 file("bbs.log"); という風にしているので、flockに記述すべきファイルハンドルが見当たりません。仮に取得できたとしても、file();の仕様からして内部にcloseが入ってそうなので、flockできたとしてもcloseで無効になってしまわないかが心配です。なのでこの場合はやはり別にログファイルを用意しないとできないということでしょうか。

    • ベストアンサー
    • PHP
  • ログの一部を消す Perl

    ログの一部を消すPerlを考えています。 ここではソースを短くするために、ログの一部を消し去って ログファイルに上書きするデータは $deta だけだとすると open F, '+<a.log'; flock F,2; $deta = <F>;//実際はここでもっと処理 truncate F,0; seek F,0,0; print F $deta; close F; と、 open IN, 'a.log'; flock IN,2; open OUT, '>a.log'; flock OUT,2; $deta = <IN>;//実際はここでもっと処理 print OUT $deta; close OUT; close IN; の2つを考えました。 上のように 読み込み と 書き込み を同時にやった方がいいのか 下のように分けてやった方がいいのか教えてください。 ロックは flock を使って、普通レベルのロックが できるぐらいでいいと思っているんだけど、 この flock の書き方でおかしいところがあれば 教えてください。

    • ベストアンサー
    • CGI
  • ファイルロックの確認

    PHPで掲示板を作っています。バージョンは5? (php.exeファイルのバージョンは5.2.1.1です。) ファイルロックについて、下記2点を教えてください。 同時書き込みによるログファイルの破損を防ぐため、ロック専用ファイルによるロックとアンロックの仕組みを作りました。 正常に稼動しているか、以下の方法でチェックしました。 1.ブラウザを2つ開く 2.両方とも書き込みボタンを押すだけの状態にする 3.両方のブラウザ(フォーム)の「書き込み」ボタンをすばやく続けてクリックする この方法だと、3で2個のボタンをクリックする間のタイムラグがあり、“同時”書き込みは難しいように思います。 他に方法があるのでしょうか? ////////// ロックファイル:lock/lock.php(755) --<?php --$lockfile = '.lock/lock.txt'; --$fp = fopen($lockfile,"w"); --flock($fp,LOCK_EX); --?> アンロックファイル:lock/unlock.php(755) --<?php --fclose($fp); --?> ロック用ファイル:lock.txt(644) ロックディレクトリ:lock(755) 動作ファイル:bbs.php --<?php --require_once './lock/lock.php'; --掲示板の処理 --require_once './lock/unlock.php'; --?> ロックのファイルを別ディレクトリに置くことは可能でしょうか? 可能であれば、パーミッションはどのようにすればいいのでしょうか? 現状、前述の方法でログが破損するかチェックしても異常ありません。 また、ロック関連の記述を削除してチェックしても異常ありませんので、ロックが正常に稼動しているのかどうか確認できない状態です。 PHPは始めたばかりですので、おかしなことを言っている箇所もあるかもしれませんが、宜しくお願いします。

    • ベストアンサー
    • PHP
  • flockについて

    ファイルを読み書きする場合に使用するflockですが、closeする前に別ファイルのflockは使用できるのでしょうか? テストしてみたところ、うまくいってるような気もするのですが、確証が持てないので質問させていただきました。 例) $file1="file1.txt"; $file2="file2.txt"; open(OUT,"+<$file") flock(OUT,2); $count1=<OUT>; open(DAT,"<$file2") flock(DAT,1); $count2=<DAT>; close DAT; $count=$count1+$count2; truncate(OUT,0); seek(OUT,0,0); print OUT "$count "; close OUT; ちょっとあえて複雑な書き方としてみましたが、上記のようにflockを使ってる最中に別ファイルのflockを使用することは出来ますでしょうか? 参考URLでも結構ですので、どなたかよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ファイルロックについて

    こんばんわ、お世話になります。 Perlのファイルロックについて教えて下さい。 色々書き方があるようなのですが、私は下記のように 単純に書いています。 #// ファイルロック開始 flock(LOCK, 2); #// ファイルオープン open(LOG, ">>$data") or exit; #// ファイルへ書き出し print LOG "$now,$ip,$ls\n"; #// ファイルクローズ close(LOG); #// ファイルロック解除 flock(LOCK, 8); 原因かわからないのですが、アクセスが多数同時にあると 10分くらいレスが返ってこなくなったりすることがあるようです。 ファイルロックに精度とかあったりすのでしょうか? 単純に、コードが1500行くらい書いているので、やっている処理自体 重いのかもしれませんが、1アクセスの場合は問題なく返ってくるので どうなのかな…と思い、投稿しました。 論理ファイル(CSV)を呼んで、中のデータを絞り込んでいき その結果をPOSTするいったこと(100ファイル分くらい)をやって います。 ファイルロックによって、パフォーマンスが悪くなったりするのか、 どなたかご教授ください。お願いします。

    • ベストアンサー
    • Perl
  • とほほのWWW入門のサンプルプログラム

    とほほのWWW入門 http://www.tohoho-web.com/www.htm トップ > アラカルト > 画像をマウスで動かす http://www.tohoho-web.com/wwwxx002.htm のサンプルプログラムがあります このままローカルコンピュータでHTMLファイルを作成して動くのですが 頭に <!DOCTYPE html> をつけると、動かなくなります <!DOCTYPE html> をつけたまま、動かす方法をわかる方、お願いします IE9です

  • open中のファイルをrename

    オープン中のファイルをflockによる排他をしたままrenameしたいのですがどうもうまくいきません。 sysopen(LOCK, "$file", O_WRONLY);   もしくは open(LOCK, "> $file"); flock(LOCK, 2); rename($tempfile,$file); close; close前にrenameするとロックが外れてしまいます。 close後にrenameをするとやはりロックが外れた状態でのrenameになります。 renameするファイル以外にflock専用ファイルを固定で一つ用意すれば簡単なのですが openしたいファイル数は相当な数があり、各ファイルごとにロックをかけたいのです。 全ファイル分のflock専用ファイルを用意するか、排他方式をmkdirにする以外 何か良い手立てはございますでしょうか。

  • ファイルのロックについて

    ファイルのロック方法を下記の様にしてロックさせていますが、同時ににアクセスが合ったときにどちらかが$add_text;を書きこまれないので順次書き込まれる様にしたいのですが、何方かご教授してもらえませんか? #!/usr/bin/perl use Fcntl ':flock'; open(ADD_DB,">>$log"); flock(ADD_DB, LOCK_EX); print ADD_DB "$add_text;\n"; flock(ADD_DB, LOCK_NB); close(ADD_DB);

    • ベストアンサー
    • Perl
  • 個別ページを検索エンジンにひっかける。

    例として、とほほのWWW入門にサイト内検索がありますよね。 そこで、質問があるのですがどうやって、とほほのWWW入門のサイト内検索のように1個1個の個別ページをGoogle検索でひっけるのでしょうか? 詳しい方、タグ、アドバイスなどお願いします。 ・とほほのWWW入門様のアドレス http://www.tohoho-web.com/www.htm

  • PHPのファイルロックについて

    関数flock();について調べてたのですが、 結局、イマイチ使い所がわかりませんでした。 とりあえずCGIを手本として以下のロックを作ってみたのですが、 もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。 ↓参考プログラム(echo部は進行を表示するためのもの) <?php define ("LOCK_FILE","./lock/lock.txt"); Lock(); Unlock(); //ロック function Lock(){ if(file_exists(LOCK_FILE)){ if(date(U) - filemtime(LOCK_FILE) > 30){ unlink(LOCK_FILE); echo("古いロック削除<br>"); } } $retry = 5; while(file_exists(LOCK_FILE)){ if($retry <= 0){ echo ("error<br>"); exit; } $retry--; sleep(1); } $lockfile = fopen(LOCK_FILE,"w"); fclose($lockfile); echo("ロック完了<br>"); } //アンロック function UnLock(){ unlink(LOCK_FILE); echo("ロック解除<br>"); } ?>

    • 締切済み
    • PHP

専門家に質問してみよう