割と正確なカウンター

 クッキー機能を使って、割と正確に訪問者数を数えてくれるカウンターを作って見ました。非常に簡単なコード内容ですが、Perlのアクセス解析スクリプトを研究していて思いつきました。通常のカウンターCGIだと、更新してもカウントしてしまって困ってましたよね(^^ゞ

 最初*.shtmlファイルでSSIを使って*.phpファイルを呼び出そうとしたんですが、見事に失敗しました(>_<)PHPはcmdともcgiとも認識してくれないんでしょうか???ハテ…(-_-;)

注意点

 データファイルには、予め「0」を記載しておいて下さい。空ファイルでは、カウントアップ出来ません。よろしく(^o^)丿

<?php PHP開始の合図。
//=================クッキーの書き込み==================
$date_now = date("Y/m/d"); //日付の取得
$cookie = $date_now;
setcookie("Cookie",$cookie);
まず最初に現在の日付データを取得して、クッキーに書き込みます。有効期限を設定していない点に注意!
?> PHP終了の合図。
<HTML>
<HEAD>
<TITLE>Accessサンプルページ</TITLE>
</HEAD>
<BODY>
<P ALIGN="CENTER"><FONT SIZE="6" COLOR="green">Accessサンプルページ</FONT></P>
<P>
<HR ALIGN="CENTER">
</P>
<P ALIGN="CENTER">あなたは、
ここは、HTML部分です。
<?php PHP開始の合図。
//========================メイン処理========================
$data_file = './access.dat'; //データファイル
$fp = fopen("$data_file", "r+");
$cnt_num = fgets($fp, 64);
if($Cookie != $date_now){
 $cnt_num++;
 fseek($fp, 0);
 flock($fp,2);
 fwrite($fp, $cnt_num);
}
fclose($fp);
printf("%06d", $cnt_num);
ここでのミソは、条件分岐の所です。クッキーに保存されている日付と、アクセスした時点での日付が違っていれば、カウント数を1増やして書き込みしています。これで更新ボタンを押してもカウント数は上がらない訳!(^.^)

クッキーの有効期限を設定していないので、一旦ブラウザを閉じてしまえば、クッキーは消えてしまいます。しかし、同じ一日のうちでも機会を別にしてアクセスして来たのは、数えてもいいかなと思いまして…(^^ゞ
?> PHP終了の合図。
番目の訪問者です。<BR><BR></P>
<P ALIGN="CENTER"><FONT COLOR='blue'>これはクッキー機能を使った、割と正確な訪問者数をカウントするカウンターです。<BR><BR>
訪問者がブラウザを一旦閉じない限り、何度ホームページを開いてもカウントしません。<BR><BR>
もちろん、更新ボタンを押してもカウントしないので、大丈夫!(^o^)丿</FONT></P>
</BODY>
</HTML>
ここは、HTML部分です。

 *上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。

fseek( )関数

書式: int fseek ( int fp, int offset [ , int whence ] )

用法: 引数fp が指しているファイルのファイル位置識別子を、ファイル・ストリーム中の引数offset バイト目にセットします。新規位置は、ファイルの先頭からのバイト数で計られます。これは引数whence で指定した位置にoffset を追加する事により得られます。この値は、以下のように定義されます。

whence

動作

SEEK_SET 位置をoffsetバイト目に設定する。
SEEK_CUR 現在の位置にoffsetを加えた位置に設定する。
SEEK_END ファイル終端にoffsetを加えた位置に設定する。

whence を指定しない場合、SEEK_SETがデフォルトで指定されます。成功すると0を返し、そうでなければ-1を返します。EOFより先の位置にシークしてもエラーとはなりません。

flock( )関数

書式: bool flock ( int fp, int operation [ , int wouldblock ] )

用法: ファイルをロックします。引数fp で指定されるファイルポインタを用いて操作を行います。引数fp はfopen( )又はfsockopen( )で正常にオープンされたファイルを指している必要があります。第2引数のoperation は、次のいずれかの値を指定します。

LOCK_SH(PHP 4.0.1より前の場合は1に設定します):共有ロック(読み手)

LOCK_EX(PHP 4.0.1より前の場合は2に設定します):排他的ロック(書き手)

LOCK_UN(PHP 4.0.1より前の場合は3に設定します):ロックを開放

LOCK_NB(PHP 4.0.1より前の場合は4に設定します):ロック中にflock( )でブロックを行わない。

ロックをブロックモードにする場合に、3番目の引数wouldblock にtrueを設定します。flock( )は成功時にtrue、エラー時にfalseを返します。

HOME