|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
どのページが何回閲覧されたかカウントするCGIプログラム、ページビューカウンターを作りましょう。
どのページが何回開かれたか?っていうのはサイト運営しているとちょっと気になります。 各ページの閲覧回数が分かれば、 情報が古くなってしまって、直さなきゃなぁと思っているページに沢山アクセスがあって、優先的に修正したり、 気合入れて更新しているページがあんまり開かれていなくて、そのページへのリンクの仕方を 検討し直したり、そんなようなことができます。
各ページのアクセス数を知りたいっていうと、 ページ毎にアクセスカウンターを付けるという方法が 思いつきますが、それはちょっと面倒だし大変ですよね。 そこで、1つのCGIプログラムで各ページの閲覧回数をカウントしちゃおうというのが今回の研究課題です。
リファラーっていうものがありましたね。 リファラーというのは、そのCGIプログラムにリンクしていたページのURLのことでした。 これを使って、1つのCGIプログラムでページ毎のカウントを行うことができそうです。 つまり、CGIプログラムの呼び出し元URL毎にカウンターの値を保持、処理するようなCGIプログラムを作ります。
今回はURL毎にカウントを行いますが、URLというのは結局のところ文字列です。 ですからURLにこだわる必要はなくて、文字列ならなんでもいいわけです。 ということで、作るプログラムが持つべき機能は、次のようなものになります。
この2つの他にも、重複カウントの防止機能とかが付いている方がいいのですが、 それは後回しにしましょう。
いつものように、後で別のCGIプログラムにも応用できるように、関数にします。 作る関数の引数などは次のようにしましょう。
関数名が悩むところですが、次のようにしました。てきとうです。
文字列毎にカウントを保持するといえば、毎度のことですが連想配列が利用できますね。 ホント、お世話になります連想配列には。 そして、連想配列をファイルに書き込む、ファイルから読み込むっていう関数は 以前作っていますので、それが利用できます。 ファイルの書き込みをするときにはファイルロックが必須ですが、 それも以前作ってありますね。…となると、あんまりやることがないかも?
#!/usr/bin/perl
require 'counters.pl';
$fname = 'pvcounter.txt';
$ref = $ENV{'HTTP_REFERER'};
if ($ref ne "") {
plab::incl_counters($fname, $ref);
}
print "Content-Type: text/html\n\n";
package plab;
require 'hashfile.pl';
require 'lock.pl';
# 引数(ファイル名, カウントを上げるキー)
# 戻値(カウント)
sub incl_counters
{
local $fname = $_[0];
local $key = $_[1];
local $lockdir = "incl.lockdir";
plab::lock($lockdir);
%counters = plab::readhashfile($fname);
++$counters{$key};
plab::writehashfile($fname, %counters);
plab::unlock($lockdir);
return $counters[$key];
}
1;
今回作った pvcounter.cgi は IFRAME タグを使って次のようにウェブページに仕込みます。 何も表示などしないので、サイズは1x1で最小にしています。
<iframe src=pvcounter.cgi width=1 height=1 frameborder=0></iframe>
このページでも、ここにカウンターを仕込んでます(見えません) →
他にも、pvcounter.cgi を仕込んだページをいくつか作りました。 それぞれ、クリックするとそのページの閲覧回数が1増えます。
現在の各ページの閲覧回数はこちらのファイルに保存されています。
今まで作成したライブラリ関数が役にたって、簡単に目的のCGIプログラムを作ることができました。 役に立ちそうなものをライブラリ関数にしておくっていうのがいかに大事かわかる瞬間ですね。
今回はカウントするところまで。次はカウントした結果を画面に表示する関数が欲しいですね。 生のデータファイルを見ても、みにくいしつまらないですから。 それに、閲覧回数の多い順で表示するっていうことはやっぱりしたいです。 ウェブページ人気ランキングですね。
あと、今回作ったCGIプログラムは何も表示しないですが、 作成した incl_counters 関数は戻り値としてカウントの値を返しますので、 これを画面に表示するようにすれば、各ページの閲覧回数をカウントする アクセスカウンターとして機能させることができます。 でも、重複カウントの処理をしていないので現状ではそういう使い方には向かないかも知れません。
ページアンケートの研究でもリファラーを使いましたが、 今回もリファラーが大活躍です。便利なものですね、リファラーって!
|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
| Copyright (c) 'PERL-LABO' All Rights Reserved. リンクフリーです。 |