簡単なCGIと言えばカウンタですね。
カウント数のデータを読み書きする必要がありますので、スクリプト本体と
データファイルを作成します。
動作サンプル →
データファイルは新規作成して内容は 0 とだけ書いておきます。
ファイル名は c.dat としました。
0
このデータファイルは読み書き共必要ですので、FTPで転送後にパーミッションは
-rw----rw-(606) または -rw-r--rw-(646) とします。
先ず、単純にカウントするだけのスクリプトです。
スクリプト本体(実行ファイル)はパーミッションを -rwx---r-x(705) または
-rwxr-xr-x(755) にしてください。
#!/usr/bin/perl
$data_file="c.dat";
open(DATA,"+< $data_file") or die print "Error";
flock(DATA,2);
seek(DATA,0,0);
$data=<DATA>;
$data++;
seek(DATA,0,0);
print DATA $data;
close(DATA);
print "Content-type: text/plain\n\n";
printf "%08d",$data;
#!/usr/bin/perl は、perlスクリプトの実行ファイルである事を意味します。
perlのパスはサーバーによって異なる場合がありますので、適切なパスに変更して
ください。
$data_file="
c.dat";
変数$data_fileにデータを記録するためのファイル名(データファイル)を
セットします。
open(DATA,"+< $data_file") or die print "Error";
は、変数$data_fileにセットされているファイルを読み書き可能な状態で開きます。
DATAはファイルハンドルです。以後ファイルを閉じるまで、このファイルハンドルを
通してデータを入出力します。
また、ファイルを開くことに失敗した場合には Error と表示します。
flock(DATA,2); はファイルへの同時アクセスを防ぐための排他的ファイルロックです。
もし同時アクセスとなったときは待機します。
次行の seek(DATA,0,0); は待機となった場合のためにファイルハンドルの
ファイルポインタをファイル内容の先頭に移動しておきます。
$data=<DATA>; で変数$dataにファイルハンドルの示すファイルの内容
(カウントの数値)を入れ、$data++; の部分でその数値に1加算します。
そして seek(DATA,0,0); で再び先頭にファイルポインタを移動して、
print DATA $data; でファイルに内容を書き込み、
最後に必ず close(DATA); でファイルを閉じます。
print "Content-type: text/plain\n\n";
printf "%08d",$data;
この2行は表示の部分です。 text/plain(テキストファイル)として送信させ、
カウンターの数値をゼロで埋めた8桁で表示させています。
文字色を変えたい等の場合は次の様にHTMLとして送信させるよう変更してください。
print "Content-type: text/html\n\n";
print <<HTML;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<title>Counter</title>
</head><body style="color:blue; background:transparent;">
HTML
printf "%08d",$data;
print "\n</body></html>";
カウンターを貼り付けるにはインラインフレーム等を使います。
フレームの幅や高さはwidthとheight属性で適当に指定しておき、
更にスタイルシートで細かく調整しています。
<iframe src="cgi-bin/c.cgi" frameborder="0" scrolling="no"
allowtransparency="true" marginwidth="0" marginheight="0" width="100"
height="24" style="width:5em; height:1.2em;
vertical-align:bottom;"></iframe>
解説は割愛しますが、次のスクリプトは日付をクッキーとしてブラウザに渡す事により、
同日のアクセスは余分にカウントしないよう改造したものです。
#!/usr/bin/perl
$cookie_name="counter";
$data_file="c.dat";
@today=localtime(time);
$today[5]+=1900;
$today[4]+=1;
$today=$today[5].$today[4].$today[3];
undef(@today);
$cookie=$ENV{"HTTP_COOKIE"};
if ($cookie) { $cookie=~s/.*$cookie_name=(\d+).*/$1/; }
else { $cookie=0; }
open(DATA,"+< $data_file") or die print "Error";
flock(DATA,2);
seek(DATA,0,0);
$data=<DATA>;
if ($cookie ne $today) {
$data++;
seek(DATA,0,0);
print DATA $data;
}
close(DATA);
print "Content-type: text/html\n\n";
print <<HTML;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<meta http-equiv="Set-Cookie" content="$cookie_name=$today">
<title>Counter</title>
</head><body style="color:black; background:transparent;">
HTML
printf "%08d",$data;
print "\n</body></html>";