[トップページ] [戻る]
CGIアクセスカウンタを作ってみる
CGIを使用したカウンタを作ってみることにしましょう。SSIは使用できないがCGIは使用できるというサーバーでは、このようなアクセスカウンタを設置することができます。CGIではSSIのように、結果がHTMLに組み込まれないので多少の工夫が必要になります。

1999/08/30 スクリプトに不具合があったので修正
HTMLからの呼び出し
CGIスクリプトの拡張子は cgi となります。

カウンタをイメージ(GIFファイル)として出力するには<IMG>からCGIを呼び出します。


<IMG SRC="./cgi-bin/count.cgi?digit=3&up=1"><IMG SRC="./cgi-bin/count.cgi?digit=2"><IMG SRC="./cgi-bin/count.cgi?digit=1">


■ なぜ、CGIを3回も呼び出すのか?
画像ファイルの連結技術がない場合、GIFファイルを一つ一つ出力しなければなりません。5桁のカウンタを表示するのであれば、<IMG>を5回呼び出さなければなりません。

■ count.cgi?digit=3って何?
カウンタファイルを呼び出すとき、何桁目の数値をGIFファイルとして出力するのかCGIスクリプトに渡しています。受け取ったCGIスクリプトでその桁のGIFファイルを出力する処理を行います。

■ up=1って何?
カウンタアップさせるときのパラメータです。一番最初のCGIを呼び出すとき一回だけこのパラメータを送信します。
カウンタの仕組み
CGIアクセスカウンタも、SSIのそれと仕組み上はほとんど同じになります。

パラメータ受け取り
カウンタファイルを読み込む
カウントする
カウンタファイルを書き込む
パラメータ解析
イメージとして出力
実際にスクリプトを記述してみる
では実際にスクリプトを記述してみましょう。
#!/usr/local/bin/perl

##### パラメータ受け取り
if ($ENV{'REQUEST_METHOD'} eq "POST") {
	read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
	$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
	($key, $value) = split(/=/, $pair);
	$form{$key} = $value;
}
$digit = $form{'digit'};
$up = $form{'up'};

##### カウントファイル読み込み
open(READ, "$count_file") || die "error";
$count = <READ>;
close(READ);

##### カウントする
if ($up == 1) {
	$count++;
	##### カウントファイルを書き込む
	open(WRITE, "> $count_file") || die "error";
	print WRITE $count;
	close(WRITE);
}

##### パラメータ解析
$img = ($count/(10**($digit-1)))%10;

##### 出力
open(IMG, "$img\.gif") || die "error";
print "Content-type: image/gif\n\n";
binmode(IMG); 
binmode(STDOUT);
print <IMG>;
close(IMG);

exit;
■ パラメータ受け取り
何桁目の数値をGIFファイルとして出力するのかを受け取ります。

■ $up==1 という条件
例えば、5桁のカウンタを出力する場合、CGIが5回呼び出されることになります。毎回カウントを行うと1回のアクセスでカウンタが+5されてしまいます。そこで、upパラメータが1のときにカウンタをアップするような仕組みにします。

■ パラメータ解析
digitの示す桁数の数値を取得します。

■ 出力
出力対象となるGIFファイルをオープンし、バイナリモードで標準出力に出力します。Content-Type は image/gif となります。
ファイルのロック機構
SSIアクセスカウンタの同じ項を参照してください。

[トップページ] [戻る]
Copyright (C) 2000 Me All rights reserved
Mail To webmaster