以前、このブログで企画した、ベリカードの話の仕組みを書こうかとおもったのですが、そんなことはあんまり興味ないとおもうので、そのベリカードのしくみの話をしつつ、今回は、
一見画像のアクセスカウンタのように見えて、実は、アクセスログを取っている
というCGIをご紹介したいと思います。
って、そのアクセスカウンタ、ベリカードの番号をだしているところの出力を変えるだけの話なので、ほとんどベリカードの番号の出し方の説明なんですけどね。
機能仕様
●IMGタグで、呼び出します。
<IMG SRC="CGIのURL/dispid.cgi?ID=bun051225">
そうすると、こんなかんじにでます。
なお、ここをカウンタ番号だけにすれば、アクセスカウンタになります。
●そして、アクセスカウンタを出すときに、アクセスログ(IPアドレスとホスト名、アクセス日時)をファイルに書き出します。
アペンドすると、排他がなんだあとか、めんどくさそうなので、
アクセスカウンタは、1つのファイル(カウンタ数だけをいれる)
→以下、カウンタファイルと呼びます
アクセスログは、1アクセス1ファイル
→以下、アクセスファイルと呼びます。
として、実際にアクセスログを見るときに、これらのアクセスファイルをあつめてきて、見せるようにします。
●いろんなアクセスカウンタをつくりたいので、各アクセスカウンタには、任意の英数字の組み合わせで作るIDというのを持つことにします。
同じIDは、同じカウンタファイルをみます(なので、それらのアクセスのトータル数となります)。
違うIDなら、違うアクセスカウンタということになります。
これを実現するため、1つのIDに1ディレクトリ(1フォルダ)をわりあて、そのフォルダの中に、カウンタファイルと、各アクセスファイルを書き出すようにします。
詳細設計
(1)必要な変数を取得する
1-1.POST型、GET型で送られる全ての変数を@qsに入れる。
ここでは、日本語の引数はこないことが前提なので、
別にURLエンコーディングはしていない
→もうひとつのほうのCGIでは、やっている。
1-2.ホスト名とIPアドレスを取得し、もし、ホスト名が入っていなかったら
gethostbyaddrで取得する。それでも取得できないときは、アドレスをホスト名に入れる
1-3.日時を取得する。
localtime(time)だと、年は1900、月は1足す必要がある
1-4.IDが入っていなかったら、defaultというIDにする
1-5.カウンタのファイルと、アクセスファイルを入れるフォルダがあるか
確認し、無かったら作る。
属性は700(自分はフルアクセス、それ以外はアク禁)
1-6.カウンタファイルを開き、カウンタの値を取得する
そして、カウンタの値に1をたし、保存する。
ただし、このとき、排他制御を行うため、カウンタファイルの名前の末尾に.lock
という名前を付けたファイルを作成し、そのファイルをロックすること。
カウンタ更新後は、アンロックする。
カウンタファイル名は、IDのディレクトリの下の "mitayo.dat"固定。
カウンタファイルの属性は600(自分は読み書きOK,他はアク禁)
1-7.アクセスファイルを作成し、そのなかにアクセス記録を書き出す。
名前は、一応一意になるように(いや、カウンタの数字で一意になってるはずなんだが)
mkstempを使って
IDのディレクトリの下の、"mitayo_" のあとカウンタ番号そのあと"_"で、
あとはmkstempの指定した値
書き出し内容は
アドレス、ホスト名、年、月、日、時、分、秒をタブ区切りで、
最後に改行をいれる
(2)画像を書き出す
2-1.出力文字列を設定する
”ID:"のあと、IDをかき、そのあと" NO:"のあとに、カウンタNOを書く。
→ここをカウンタ番号だけにすれば、アクセスカウンタになる。
2-2.画像のクラスを生成する
2-3.使う色を、colorAllocateメソッドを使って確保する
2-4.背景を透明にして、インターレースにする
2-5.外側の四角形を書く
2-6.テキストを書く
2-7.ヘッダの書き出し。
"Content-type: image/png\n\n"
2-8.png形式で書き出す。
ソースのありか
上記の仕様をもとに、作成したソースは、こちら
http://www.geocities.jp/xmldtp/bv_dispid_cgi.txt
●具体的に、アクセスカウンタにするには
################################# # 画像ID書き出し # ################################# #出力文字列を設定 $outtext="ID: " . $qs{"ID"} . " NO: ". $qs{'mitayoNo'}; |
の$outtextで始まる行を
$outtext=$qs{'mitayoNo'}; |
に書き換えてください。
インストール
上記のソースファイルを、dispid.cgiという名前で保存し(実は、ほかの名前でもいいけど)、CGI置き場において、CGIが動く属性(700とか)に変えたら、それを呼び出すHTMLファイルを作ってください。呼び出し方は、したのようなかんじ。
<IMG SRC="CGIのURL/dispid.cgi?ID=自分でつけたID">
もちろん、<>は半角にしてくださいね。
CGIのURLは、http://ではじまる、各自のCGIのURL,
IDは、任意の英数字です
(ディレクトリとして付けられる名前で、かつ1バイト文字なら、実はなんでもOK)
次に、本当は、ベリカードでいうと、報告のHTMLを説明することになるのですが、そんなことより、ここでとった、アクセスファイルを、どうやってみるのよ?ということが気になると思うので、それについて、今度、気が向いたときに説明します。