超簡単アクセスカウンター
ここでは、SSIを使った超簡単なアクセスカウンターをご紹介しましょう。SSIを使っていますので、カウンターを表示するページの拡張子は通常*.shtmlでなくてはいけません。まあ、サーバーの設定にも拠るけどね(^^ゞ
必要なファイル
ファイル
属性
目的
counter.shtml 644 カウント数を表示するWebページです。 counter.cgi 755 カウントを行うスクリプト本体。 counter.dat 666 カウント数を保存しておくデータファイル。 うちのサーバーは、SSIをユーザーディレクトリのどこででも有効になるよう設定していますので、*.shtmlファイルはユーザーディレクトリのどこに置いても大丈夫ですが、皆さんが使う時は加入のプロバイダ等の環境を調べてからにして下さい。
ファイルの配置
すべてのファイルをまとめてcounterフォルダの中に入れ、cgi-binディレクトリの中に配置して下さい。ばらばらに設置するより、こちらの方がすっきりしますしね(^^ゞ
又、うちのサーバーはCGI実行ファイルの拡張子を*.cgiに限定しているので、CGIスクリプトファイルには拡張子*.plは一切使いません。
各ファイルの内容
(1)counter.shtml
<HTML>
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
今までの訪問者数は、<!--#exec cmd="./counter.cgi" -->です。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
</HTML>適当な位置でcounter.cgiを呼び出してカウント数を表示してやります。counter.cgiで処理された結果(返り値)がこの部分に反映されます。
(2)counter.cgi
#!/usr/local/bin/perl #RedHat系では「#!/usr/bin/perl」が多い。ここは1行空ける事! #カウンター数記録用ファイルを指定。 $file = "/home/perl/public_html/cgi-bin/counter/counter.dat"; open(FILE, "+<$file"); #ファイルを読み書き両用で開く。 flock(FILE, 2); #ファイルロックをかける。 $num = <FILE>; #ファイルから保存されているカウント数を呼び出す。 chop $num; #chop関数で変数$numの最後の文字を取り除く。 $num++; #カウントを1増やす。「$num = $num + 1」の省略形。 seek(FILE, 0, 0); #seek関数でファイルの読み書きの位置を先頭にする。 print FILE "$num\n"; #ファイルに新しいカウント数を書き込む。 printf("%05d", $num); #カウント数をページに出力。 flock(FILE, 8); #ファイルロックを解除。 close(FILE); #ファイルを閉じる。 exit; chop関数「chop[文字列の変数, 配列]」・・・文字列の最後の文字を取り除き、その文字を返します。ここでは行末の改行コードを取り除いています。
seek関数「seek<ファイルハンドル>, <オフセット>, <起点>」・・・ファイルポインタの位置を指定します。処理の概要は以下の通りです。
ファイルオープン時は、ファイルポインタは1行目にある。 読み出すと、ファイルポインタは2行目に移る。 ここで書き出すと、2行目に書かれてしまう。 ファイルの先頭に書き出す為にseek関数を実行。 データが1行目に書き込まれ、正常に更新された。
0▼ポインタ
FILE
0
▼ポインタ
FILE
0
1
FILE
0▼ポインタ
FILE
1
FILEprint関数「print[ファイルハンドル][出力リスト]」・・・ファイルハンドルに対して出力を行います。
printf関数「print(フォーマット定義, 文字列)」・・・フォーマット定義に従って文字列のフォーマットを行い、出力します。
%05d・・・頭に0がつく5桁の10進数(d)の意味。
最初カウンター数記録用ファイルの指定で躓きまして、どこをどう直しても動かなくて困ってたんですが、結局相対パスなどを使わず/homeディレクトリからきちんと指定してやれば、難なく動くようになりました。あー、やれやれ(-_-;)それと、スクリプト中の変数名を途中で変更したので、コードにちぐはぐな所があったと思います。もう直しましたので、ご勘弁の程を_(._.)_
(3)counter.dat
0 初期値を入れて置きます。
実際の動作例
実際のサンプルページは、こちら。
超簡単掲示板 前へ |
次へ 超簡単チャット |