ひとつのCGIを複数のユーザーで共用するためreport.cgi?ID のように引数をつけユーザーごとにログを吐くようにしています。
replist.cgi(ログを見やすくグラフにするスクリプト)の複数使用に対応するように改造ししっかり動いてくれましたがログを作成するreport.cgiの複数使用化がうまいいきません。
ユーザーIDを認識させログを書かせるため以下のように書き換えました。
--------
#引数を取得
$id = $ENV{’QUERY_STRING’};
# ログファイル
$logfile = ’./¥$id¥replog.cgi’;
-------
しかし何回やっても500で作動してくれません。どうしたらいいのでしょうか。見事解決してくれた方には少ないですが100P以上差し上げます。
■対策案1
$logfile = ’./¥$id¥replog.cgi’;
というのは、おそらく$idディレクトリごとにファイルを作成する
という理解でよろしいでしょうか。
としますと存在しない場合は、作成する必要があります。
そこで、
「$logfile = ’./¥$id¥replog.cgi’;」を
「# $logfile = ’./¥$id¥replog.cgi’;」とコメントにします。
次に、
「# ログ読み込み
open(IN,”$logfile”) || &error(”Open Error : $logfile”);」を
「# open(IN,”$logfile”) || &error(”Open Error : $logfile”);」とコメントにし、以下を加えます。
#ディレクトリ存在チェック・作成
if (-d $id){
mkdir $id, 0777 || &error(”ディレクトリ作成エラー”);
}
#ファイル存在チェック・作成
if (-e ”$id/$logfile”){
open(INOUT,”$id/$logfile”) || &error(”オープンエラー”);
}else {
open(INOUT,”+>$id/$logfile”) || &error(”ファイルリ作成エラー”);
}
そして、
「# 更新
open(OUT,”>$logfile”) || &error(”Write Error: $logfile”);」を
「# open(OUT,”>$logfile”) || &error(”Write Error: $logfile”);」とコメントにし、以下を加えます。
open(OUT,”>$id/$logfile”) || &error(”Write Error: $id/$logfile”);
■対策案2
$id = $ENV{’QUERY_STRING’};
の$idは、ちゃんと文字列がとれていますでしょうか?
もし取れていなければ、こうしては、いかがでしょうか?
&decode;
$id=$in{’ID’};
#-------------------------------------------------
# デコード処理
#-------------------------------------------------
sub decode {
local($buf, $key, $val);
if ($ENV{’REQUEST_METHOD’} eq ”POST”) {
read(STDIN, $buf, $ENV{’CONTENT_LENGTH’});
} else {
$buf = $ENV{’QUERY_STRING’};
}
foreach ( split(/&/, $buf) ) {
($key, $val) = split(/=/);
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(”H2”, $1)/eg;
# 不要コード削除
$val =~ s/&/&/g;
$val =~ s/”/"/g;
$val =~ s/</</g;
$val =~ s/>/>/g;
$val =~ s/¥r|¥n|¥0//g;
$in{$key} = $val;
}
}
The CPAN Search Site - search.cpan.org
URLはダミーです。
そのスクリプトのコードがないので憶測になっちゃいますが、
$logfile = ’./?$id?replog.cgi’;
が間違ってるんじゃないかなと。
$id を $logfile に対して展開したい場合は、
$logfile = $id . ”replog.cgi”;
あるいは
$logfile = ”${id}replog.cgi”;
ですね。シングルクオートだと変数が展開されないので、文字列連結か、ダブルクオートで ${id} と変数の境界を明示するかどっちかです。
それ以外の部分でだめしたらごめんなさい。
回答ありがとうございます。。。って!はてなのチィーフテクノロジーオフィーサーじゃないですか。こんな形でしかもご回答いただけるなんて感激です。実は私直也様のファンなんです。特にCnetの記事のすばらしさには感動しましたw
ところで問題に戻ります。さすがCTO。みごと $logfile = $id . ”replog.cgi”;で問題が解決しました。まことにありがとうございます。
いやぁ〜しかしスタッフの方もこのようにご回答されているのですね。ご苦労様です。
PS:ソフトバンクのWTY(?)のノミネートおめでとうございます。
回答ありがとうございました。
残念ながら2つの対策案を試してみましたがInternal Erorr(500)になってしまいCGIが作動してくれません。
ありがとうございました。