• ベストアンサー
  • 困ってます

ファイルロックのかけ方

今、PerlでCGIを作っているのですが 友達にデータファイルをロックした方がいいよ。 って言われました。 その友達もロックの仕方は知らないみたいですので 何か良い方法があったら教えてください。 それと、ロックというのは 読み込むときと書き込むとき両方必要なのかも教えてください。 宜しくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数381
  • ありがとう数5

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

  • ベストアンサー
  • 回答No.1
noname#9414
noname#9414

読み込み時は、別にかけなくてもいいですが、 書き込み時は、同時に複数の人が書き込むことを 防ぐために、ファイルをロックをする必要が あります。 #同時に書き込まれると、ファイルが壊れる #可能性があるので・・・ ロックのかけ方は、flockという関数があるので それを使うのが一番簡単でしょう。これについては 必ず参考書に載っているので、本屋さんでPerlの 本を購入してきて、探してみるといいでしょう。 私のお薦めの本は、以下のものです。 SOFTBANK出版 結城 浩【著】 Perlで始めるCGI入門 基本編/応用編 という2冊セットになっているものです。 もちろん、1冊でも十分役に立つので、 一度見てみてはどうでしょうか。 ではでは☆

共感・感謝の気持ちを伝えよう!

関連するQ&A

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

    以下のようなプログラムを作り実験しているのですが、よくわからない事態になっています。 まず、ブラウザを2つ用意して、一方のブラウザで実行した後、すぐに2つめのブラウザで実行します。 mkdirの場合、$which=1として、2つ目を実行すると、busyとでます。これは1つ目がロックしているからということは分かります。 しかし、symlinkの場合、2つ目でもbusyという文字はでず、何事もなかったように両方ともOKと表示されます。これは本当にロックできているのでしょうか。また、この場合、lock.cgiが生成されません。 また、サーバーによってはmkdirで試行すると、まだロックしていないにもかかわらず、busyとでるのもあります。これは、mkdir方式が対応していないと考えればよいのでしょうか。 ------------------------ #! /usr/local/bin/perl $lockfile = "./lock.cgi"; $which = 1; filelock(); sleep 10; fileunlock(); error("OK"); sub error{ print <<END; Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML><HEAD> </head> <body> $_[0] </body></html> END exit; } sub filelock { if (-e $lockfile) { # 3分以上古いロックは削除する ($mtime) = (stat($lockfile))[9]; if ($mtime < time - 60) { fileunlock(); } } local($retry) = 2; if($which){ #mkdir関数式ロック while (!mkdir($lockfile, 0755)) { if (--$retry <= 0) { &error("busy"); } sleep(1); } }else{ # symlink関数式ロック if ($lockkey == 1) { while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error("busy"); } sleep(1); } } } } sub fileunlock { if($which){rmdir($lockfile);}else{unlink($lockfile); } }

  • ファイルロックの仕方

    Perl5を使ってCGIを作っています。 環境としては、OSはLinuxです。 ファイルロックなんですが、flockを使うということはわかっているのですが、ファイルが壊れ難いファイルロックの書き方というのがあるのなら教えて欲しいと思って質問しました。 初心者なので、出来れば書き方・使い方を詳しく教えて頂けたらと思います。 よろしくお願いします。

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

    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

その他の回答 (1)

  • 回答No.2
noname#25358
noname#25358

 flockの解説は下記のHPにも載っています。

参考URL:
http://wakusei.cplaza.ne.jp/twn/

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • ファイルロックの質問

    プロバイダ:VC-NET スクリプト:Perl 在庫管理などで、在庫を変更中に変更前の値を第三者が閲覧してしまうと矛盾がおきますよね?そこで質問なのですがこの様な場合みなさんどうされてるのですか? 私は、書き換えるファイルを file → file986172208 アクセスした時間(Perlのtime)を付加してファイルロックをして、 書き込みを終えれば file986172208 → file また元に戻す。 イントラネット上では期待した結果が得られたのですが、いざアップしたら ”サーバー側のエラーですよ”と表示されました。 ですがTELNETから動作させるとうまく動作しました。 ファイルのパーミションは スクリプトファイル:755 データファイル:666 です。 みなさんからのご意見お待ちしています。

    • ベストアンサー
    • CGI
  • PerlとPHPで同一ファイルをファイルロック

    PerlとPHPで同一のファイルを読み書きする必要があるのですが、ファイルロックする機構を作るには互いの言語でmkdirで対応したほうがよいのでしょうか? flock関数がPerlにもPHPにもありますが、これは、PHPのプロセスで実行したロックの状態をPerlで検知したり、または逆のことはできないのでしょうか? もしできないとするとmkdirで同一の機構を作ったほうが良い気もしますが、何か問題などは起きないでしょうか。

    • ベストアンサー
    • PHP
  • ファイルロックのおすすめプログラムはありますか?

    こんにちは! 表題通りperl製CGIのファイルロックについてなのですが。 現在こちら(http://www1.plala.or.jp/bagi/labo/lock.html) のファイルロックを使用させて頂いているのですが、数ヶ月に1度くらいの頻度でログが飛んでしまいます。 同時アクセスによって飛ぶ、というのは理解できるのですが、それにしては少し多いんじゃないかな?と思い質問させていただきました。 このプログラムに問題があるのか、それともやはり同時アクセスのせいなのでしょうか。 合わせて、もしオススメのファイルロックのプログラムがあれば、参考に紹介していただければと思います。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 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
  • mkdirでのファイルロック

    私はCGIの経験がほとんどなく超初心者です。下記のようなファイルを作りましたがファイルのロックをしなければデータが書き込まれないようなので困ってしまっています。flockはつかえないようなのでmkdirでロックをかけたいのです。 #! /usr/local/bin/perl $| = 1; require './jcode.pl'; require './mimew.pl'; require './cgi-lib.pl'; &ReadParse(*FORM); $thisfile = 'mother'; $countfile = './mother.txt'; $predatadir ='./mom'; $fromname = "sabra net"; $fromemail = '***@****.co.jp'; $act = $FORM{'act'}; #### main始動 #### if($act eq "indata"){   &getnumber;   &datamod;   &inputDB;   &mailsend;   &view; } else{   &datamod;   &kakunin; } #### main終了 #### #### メッセージ番号設定 #### sub getnumber {   open(COUNTER,"$countfile") || &error('countfileが開けない');     $this_num = <COUNTER>;   close(COUNTER);     $this_num++;   open(COUNTER,">$countfile") || &error('countfileに書きこめない');     print COUNTER "$this_num";   close(COUNTER);   if( length($this_num) == 1 ){     $this_num ="000000" . $this_num;   }   elsif( length($this_num) == 2 ){     $this_num ="00000" . $this_num;   } } #### datafileへ入力 #### sub inputDB {   $datafile = "$predatadir/userdata01.csv";    open(DB,">>$datafile") || &error('datafileに書きこめない');      print DB "$yourname,$email\n";    close(DB); }

    • 締切済み
    • CGI
  • PerlでCGIを書いておりますが、特定のURL(ディレクトリ)の位置データを取得するには?

    PerlでCGIを書いております。 http://test.com/a/test/index.cgiにアクセスしているときに、perlがaを取得して、http://test.com/b/test/index.cgiにアクセスしているときbを取得する良い方法は有るのでしょうか?WindowsとLinuxの両方で動作できれるものがあれば宜しくお願いします。 WindowsとLinuxではディレクトリの感じが違うようなので1個の方法で実現できれば助かります。

    • 締切済み
    • CGI
  • perl使用のCGIでのデータファイルの取り扱いについて

    こんにちは、 perlでCGIを動かしているんですが 掲示板やアクセスログなどのデータファイルの置き場所についてこまっています perlのopen関数などでファイルを開くことはできても、直接URLを指定すれば 見ることができてしまいまます。 内部の実行からは読み書きできて、直接URLを指定したら、アクセス拒否にする というパーミッションの設定or.htaccessなどの設定方法があれば教えてください。

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

    こんにちは。ちょっと質問があります。 WORDとかEXCELとかって ファイルを開く時にロックをかけて、 パスワードを入れないと開かないように できますよね。 あれって、出来る人がやればパスワードを知らなくても ファイルを開けたり、パスワードを調べたりとか できちゃうんですか? 方法はともかく、パスワードを設定したから 安心と思いきや、もしかして見れる人がいるかも・・・。 とちょっと心配になったので。 どうなのでしょうか?? 皆さん、ご意見よろしくお願いいたします♪

  • ファイルロックの解除方法

    CreateFileでロックしたファイルをCloseHndleするのを忘れてしまいました。 PCを再起動せずにファイルのロックを解除する方法はありませんか?

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

    いつもお世話になっています。 WinXPユーザーです。 ファイルを暗号化したく、 幾つかのフリーソフトを利用させていただいたのですけれども、 ファイルサイズが大きい場合、「暗号化」や「復元」に時間がかかってしまいました。 なるべく短時間で「暗号化」「復元」できるように、 一番上のフォルダーだけにロックをかければいいのかなと思いました。 (一番上のファルダーが開かなければ、その下のファイルは開きにくい?) そのような、 一番上のファイル、もしくはフォルダーのみにロックをかけられるソフトはございますでしょうか? できればフリーソフトが希望です。 どうぞよろしくお願いいたします。

専門家に質問してみよう