• ベストアンサー

rename関数のファイルロック

カウンタスクリプトを作る際に、必ずファイルロックってしますよね。 いろいろなサンプルを見ると、symlink関数やmkdir関数、open関数などを使ったロック方法があるんですけど その中にrename関数を使ったものがあるんです。 解説を読んでみると、rename関数の方が他のよりも比較的に良いようなことが書いてあるのでさっそく使用。 しかし、表示が遅いんです。 カウンタは画像連結をしてIMGで呼び出しています。 renameでロックすると遅くなるのは、もうどうしようもないことなのでしょうか?

noname#96662
noname#96662
  • CGI
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • nta
  • ベストアンサー率78% (1525/1942)
回答No.1

画像の転送時間に比べれば排他制御の時間などほとんど問題にならないはずです。画像を使わないカウンタで比較してみてはいかがでしょう。 排他制御を行うファイルが置かれているディレクトリに非常にたくさんのファイルが存在する場合には名前の検索に時間がかかることが予想されますが、その場合でもsymlink mkdirなどの他の方法と時間的に差があるとは思えません。

関連するQ&A

  • 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にする以外 何か良い手立てはございますでしょうか。

  • ロック??

    データファイルとかは同時書き込みされると破損するみたいですね。 それを防ぐにはとうすりゃいんだ?と思い書籍(十日でおぼえるPerl講座)をみるとFlock関数を使えばいいとありました。 しかし自分が使っているスクリプトのロック関数は MkdirとSymlinkだけです。 これはどうすればいいんでしょうか?

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

    以下のようなプログラムを作り実験しているのですが、よくわからない事態になっています。 まず、ブラウザを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); } }

  • unlink 、renameが使えない理由

    Redhat linux + Perl(↓バージョン) This is perl, v5.6.1 built for i386-linux Copyright 1987-2001, Larry Wall でunlinkとrenameがうまく使えないのは何故でしょうか? mkdirやmvも使えなかったように思います。rmやmkdirなどの linuxコマンドの権限は700にいじってあります。 関係あるのでしょうか?ただ755に戻してmvをしてみましたが やっぱり使えませんでした。私のミスでなければrootで 実行してもうまく動きませんでした。使える関数使えない関数 あるのでしょうか。もしそうだとしたら、その環境使える関数の リストを列挙するスクリプトやコマンドはあるのでしょうか? よろしくお願いします

    • ベストアンサー
    • Perl
  • BBSについて

    初心者です。BBSを作ろうと思って、kent-webさんのサイトから画像Up可の掲示板のスクリプトをDLしました。http://www.kent-web.com/bbs/joyful.html しかし以下の点がわかりません。 ・ # ロックファイル名   $lockfile = './lock/joyful.lock'; と書いてあるので、lock/joyful.lockというディレクトリをつくったのですが、書き込んでみると、 LOCK is BUSYとでます。ファイルロック形式がよくわからないときは2にしろとかいてあったので2にしてます。    # ファイルロック形式    # → 0=no 1=symlink関数 2=mkdir関数    $lockkey = 2; あと画像をUpする場所はどうやって確保したらよいのでしょうか? どうかご教授おねがいします。m(_ _)m

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

    検証をかけたところロック中になってしまいます。 自分ではわからないので…すいませんが確認をお願いいたします。 #▼ロックファイル sub lock { $symlink_check = (eval { symlink("",""); }, $@ eq ""); if (!$symlink_check) { $c = 0; while(-f "$LOC") { $c++; if ($c >= 3) { &error("■ロック中"); } sleep(2); } open(LOCK,">$LOC"); close(LOCK); } else { local($retry) = 3; while (!symlink(".", $LOC)) { if (--$retry <= 0) { &error("■ロック中"); } sleep(2); } } } sub COPY { $COPY="<div align=right><a href=http://www.jline.co.jp/fn/></a></div>";} sub error { if (-e "$LOC") { unlink($LOC); } print "Content-type: text/html\n\n"; print "<html><head><title>$TITLE</title></head>\n"; print "<body>\n"; print "■エラー<hr>\n"; print "$_[0]\n"; print "</body></html>\n"; exit; }

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

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

    • ベストアンサー
    • PHP
  • 何の違いですか?

    ファイルロックのSymlinkとMkdirの違いはなんですか? 長所、短所がありましたら教えてくださると嬉しいです。

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

    たとえばカウンタなどを作ろうと思ったとき、データを保存する ファイルを2重にアクセスできないようにするために、ロックファ イルを用意するのが一般的だと思います。 しかし、単にロックファイルを作って、それを if (-e $lockfile) {~~} などとやっても、けっこう頻繁に2重アクセスされてしまいます。 実際、以前、1000アクセス/日あるページを運営していたとき、上の 方法では3日に1回は壊れました。 上の方法は、理論上はありえないはずなのに、なぜおこるのでしょうか? また、ロックファイルではなくロックディレクトリを作って、 unless (mkdir ("./lock", 0777)) {~~} と行うことによっても、同様の判定が可能かと思いますが、 こちらの方法でもやはり2重アクセスが発生してしまうことが あるのでしょうか? その確立は、ロックファイルと同一レベル でしょうか? また、発生するならば、ディレクトリシステム上に 同じ名前のディレクトリが2つ存在することになるのでしょうか? もしわかる方がいらっしゃいましたら、ぜひ教えてください。

    • ベストアンサー
    • CGI
  • lockについて

    $file = 'file.log'; ------------------------------------ sub a{ &lock;ロック 1: open(IN, $file); # ファイルを開く 2: $count = <IN>; # カウンターを読み出す 3: close(IN); # ファイルを閉じる 4: $count++; # カウンターをひとつ増やす 5: open(OUT, "> $file"); # ファイルを開く 6: print OUT "$count\n"; # ファイルにカウンタを書き込む 7: close(OUT); # ファイルを閉じる 8: print "$count\n"; &unlock;ロック解除 } ------------------------------------ sub b{ 1: open(IN, $file); # ファイルを開く 2: $count = <IN>; # カウンターを読み出す 3: close(IN); # ファイルを閉じる } ------------------------------------ サブルーチンaではロック処理を行っていますが、 サブルーチンbでは書き込む処理がないためロック処理を行っていません。 読み込むファイルは同じでなのですが、 サブルーチンbにもロック処理を入れた方がいいのでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう