ローカルでcgiのテストをする際にファイルオープンができない理由

このQ&Aのポイント
  • ローカルで使用するActivePerlやANHTTPDを使ってcgiのテストをしようとすると、ファイルオープンなどがうまくいかないことがあります。
  • 一方、そのままweb上にアップした場合には、ファイルオープンが正常に行われ、ログファイルが表示されます。
  • この現象の原因は、ローカル環境の制約や設定によるものであり、具体的な原因は確定していません。
回答を見る
  • ベストアンサー

ローカルだとうまくいかない。。

ActivePerlやANHTTPD?を使用してローカルでcgiのテストをしようとしています。 普通のcgiファイルは表示されますが、ファイルオープンなどがうまくいきません。 ためしにそのままweb上にアップしたら、きちんとログファイルが表示されました。 open FILE,"<log.log"; flock(FILE,2); @log = <FILE>; flock(FILE,8); close FILE; $gyou = @log; print "ログファイル:@log<BR>\n"; こんなふうにしてあります。 なぜローカルだとファイルオープンができないのでしょうか?

  • w-inty
  • お礼率72% (1169/1618)
  • Perl
  • 回答数1
  • ありがとう数1

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

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

ローカルの環境がわからないので、 ある程度ヤマ当てで書いてみますが・・。 flockの行を両方とも外して実行してみてください。 それでうまく実行できるならば、 ローカルの環境がflockに対応していないということになります。 #OSやPerlのバージョンくらいは明記するといいですよ^^

w-inty
質問者

お礼

回答ありがとうございます! flockをはずしたらできました! ローカルで対応してないってこともあるんですね、知りませんでした。 >#OSやPerlのバージョンくらいは明記するといいですよ^^ 慌ててこんな基本的なことをかくのも忘れてました(^^; スイマセン。ありがとうございました。

関連するQ&A

  • cgiログファイルの書き込みに余計なスペースが入る。

    ---------- #ここでログファイルに書き込みを行う。 open(FH,">>log.log"); print FH"ID=$ID&COUNT=$COUNT\n"; close(FH); #ログファイルをさらに開く。 open FILE, "<log.log"; flock(FILE,2); @log = <FILE>; flock(FILE,8); close FILE; ログファイルを並び替えてその順番で書き込み。 $gyou = @log; @sort=sort{(split(/&/,$b))[1] cmp (split(/&/,$a))[1];} @log; print "<FONT COLOR=RED>@sort</FONT><BR>\n"; open(FILE2, ">log.log"); print FILE2"@sort"; close (FILE2); ---------- というように行っていますが、一番最初のID=01&とかの前に半角スペースが入ります。 下の行に行くほどスペースが増えます。 どこが原因でしょうか?

    • ベストアンサー
    • Perl
  • ログファイルと受信データを比べたい。

    フォームを使用して送られてきたデータをlogを比べて同じものがあったら、同じものがあるということを表示したいのです。 前にも同じようなことをしてできたはずなのですが、なぜかできなくて…。 もうずーっとやっていて頭がボーッとしてきてしまいました。。。。 #フォームで受信したデータ read(STDIN,$buffer,$ENV{'content_length'}); $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #ログファイルオープン open FILE,"naisen.log"; @FILES =<FILE>; close FILE; $i=0; $n=0; $gyou = @FILES; #文末の改行を削除 $buffer =~ s/\n$//; $FILES[$i] =~ s/\n$//; foreach(@FILES){ @log = split(/&/,$FILES[$i]); ($keys,$values) = split(/=/,$log[$_]); $FORMS{$keys} = $values; } for ($i=0; $i<=$gyou-1;$i++){ if ($buffer eq $FILES[$i]){ print "$i行目<BR>\n"; } else{ print "$i行目。これはありません。<BR>\n"; print "$FILES[$i]<BR>\n"; print "$buffer<BR>\n"; } } ログの1行目と同じものとときだけ、きちんとした結果がでます。 上記のほかにもいろいろやりましたができませんでした。

    • ベストアンサー
    • CGI
  • ログファイルを削除するcgiプログラム

    ログファイルを削除するcgiプログラム -------------------- $GYOUSUU = $FORM{'GYOUSUU'}; #--- ログファイルオープン open(FH,"***.log"); flock(FH,2); @FILES = <FH>; flock(FH,8); close FH; undef $FILES[$GYOUSUU]; open (FH2,">***.log"); @filew = "@FILES\n"; print FH2@filew; close(FH2); -------------------- となっているのですが、修正後にログファイルの行の頭に、半角スペースが入ってしまいます。 どこを修正すればいいのでしょうか?

    • ベストアンサー
    • Perl
  • Perl オープン関数について

    Perl オープン関数について いつもお世話になっております。 オープン関数でわからないことがあるのでご教示お願い致します。 ■test.cgi■ open(FILE, ">sled/$log") or die("error :$!"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE; ■bbstest.cgi■ open(FILE, ">>sled/$loglog") or die("error :$!"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE; 上記のtest.cgi側では「>」これが1個で書き込まれるのですが bbstest.cgi側では「>」これ1つだけですと、すべての内容がリセット され、その時入力した内容だけ残ります。 それを「>>」にすると追加はされるのですが、 test.cgi側では 上へ上へと内容は追加されていくのに対し bbstest.cgi側では 下へ下へ追加されていきます。 書込方法は、両方共 unshift(@DATA,"$NO,$tm,$TITLE,$TEXT,$PASS,$IP\n"); このようにしているのですが、 なぜ、同じ処理で、書込方法がかわるのでしょうか? 目的は上へ上へがいいのですが。。。

    • ベストアンサー
    • Perl
  • 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
  • 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にする以外 何か良い手立てはございますでしょうか。

  • ローカル環境でのCGIエラー

    ActivePerlとAn HTTPdでWindowsXP HomeEditionのPC上でCGIを動かそうと思っています。 どちらも最新版をダウンロードしてインストールしました。 ActivePerlに関してはegフォルダ下のexample.plで動作確認が取れています。 An HTTPdに関してはhttp://127.0.0.1以下のURLを指定してページが表示されています。 ですが、htmlからcgiを呼び出そうとすると「ページを表示できません」「サーバーが見つからないか、DNS エラーです。」のエラーが出てしまいます。 試しにcgiファイルをフルパスで指定したのですが同じでした。 ちなみに、簡単なCGIプログラムtest.cgiを作成、サーバにアップして動作を確認しましたがローカルではエラーになります。 また、ローカルでコマンドプロンプトにて c:\usr\local\bin\perl c:\プログラムのパス\cgi-bin\test.cgi と入力すると内容を表示します。 コマンドプロンプトでCGIプログラムのあるcgi-binディレクトリに移動して perl -v と入力するとperlのバージョン情報を表示するので、パスは通っていると思われます。 Au HTTPdのerrors.logには Thu Aug 16 19:21:18 2007 Warning: CGI TerminateProcess 2500 error 5 とりあえず、自分で原因を絞れるであろうところはあたってみたつもりですが、何か見落としていることがあるでしょうか? もしかしたらAu HTTPdに問題があるでしょうか?

    • 締切済み
    • CGI
  • 掲示板を全削除機能にしたいのですが

    現在使っている掲示板は投稿を個別に削除は出来るのですが、一括削除は出来ません。一括削除だけしたいのですが、一括削除できる定型文のようなものはあるのでしょうか?よろしくお願いします。(Iモード用BBSです。本CGIスクリプトのメンテ部分です。) sub mainte { my($del) = (0); if($form{'pass'} ne $mainte_pass){ &error ("bad password."); } $out_val{'pass'} = $form{'pass'}; if($form{'id'}){ # delete if(&lock($log_file, 5)){ open (IN, "< $log_file") or &error ("can't open $log_file to read. $!"); open (OUT, "> $log_file.$$") or &error ("can't open $log_file.$$ to write $!"); $del = 0; while(<IN>){ if(/^$form{'id'}\t/){ $del = 1; next; }else{ print OUT $_; } } close IN; close OUT; if($del){ rename $log_file, "$log_file.bak"; rename "$log_file.$$", $log_file; chmod 0666, $log_file; $msg = qq|$form{'id'}番の投稿を削除しました。<BR>\n <A href="$out_val{'cgi_name'}">戻る</A>|; &error($msg); }else{ unlink "$log_file.$$"; $msg = qq|$form{'id'}番の投稿は存在しません。<BR>\n <A href="$out_val{'cgi_name'}">戻る</A>|; &error($msg); } } }else{ if(&lock($log_file, 5)){ open (IN, "< $log_file") or &error ("can't open $log_file to read. $!"); while(<IN>){ ($id, $time, $name, undef, $title ) = split "\t"; $out_val{'del_list'} .= qq|$id, $time, $name, $title<BR>\n|; } &page_out($mainte_page); } } unlock($log_file); return 1; }

    • ベストアンサー
    • CGI
  • 受信データの分割

    @atai = split(/&/,$buffer); foreach $atais(@atai){ ($key, $value) = split(/=/, $atais); $FORM{$key}=$value; } 多分上記のようなことをすればできるのだと思うのですが、 自分の力でコードをかきたくて、1行ずつかいてみました。 #ファイルオープン open FILE,"<log.log"; flock(FILE,2); @log_data=<FILE>; flock(FILE,8); close FILE; foreach(@log_data){ (@log) = split(/=/,$_); } foreach(@log){ ($log_data) = split(/&/,$_); } foreach($log_data){ ($key,$value) = split(/=/,$_); } $FORM{$key}=$value; このようにかいてみたのですがうまくいきません。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • 行頭に変なスペースが…

    入力したデータをログファイルの一番上に入れたいために以下のようにしました。 open(FH2,"***.log"); flock(FH2,2); @files = <FH2>; flock(FH2,8); close FH2; open(FH,">***.log"); @filew = "user=$FORM{'name'}<>TIME=$FORM{'TIME'}\n@files"; print FH @filew; close(FH); こうするとなぜかログファイルの2行目以降の頭にスペースが1文字分入ります。 2個目のログファイルオープンの3行目 print FH @filew; のスペースが原因かと思い、 print FH@filew; としてみましたが、やっぱりスペースが入りました。 このスペースを入らないようにするにはどうしたらいいでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう