PHPを使ったカウンタ

Feb. 10, 2004


Webページのカウンタである. 目新しさは全く無いのだが,PHPの勉強も兼ねていろいろと試行錯誤してみた結果をまとめておく.

最も簡単なやつ

カウントした数字を単に文字として表示するものである. アクセスされる度にデータファイル(access.dat)に記録された値を読み込み,1を加算して表示した後, 同名のファイルに値を上書きする.

<?php
 $datafile = './access.dat';
 $fp = fopen( $datafile, "r+" );
 $cnt = fgets( $fp, 64 );
 $cnt = $cnt + 1;
 fseek( $fp, 0 );
 flock( $fp, 2 );
 fwrite( $fp, $cnt );
 fclose( $fp );
 echo $cnt;
?> 
画像で表示するやつ

値を文字で表示するのではなく,1.gif,2.gifのような画像を使うのだったら,

<?php
 $datafile = './access.dat';
 $fp = fopen( $datafile, "r+" );
 $cnt = fgets( $fp, 64 );
 $cnt = $cnt + 1;
 fseek( $fp, 0 );
 flock( $fp, 2 );
 fwrite( $fp, $cnt );
 fclose( $fp );
 for( $i = 0; $i < strlen( $cnt ); $i++ )
     $value[ ] = substr( $cnt, $i , 1 );
 for( $j = 0; $j < count( $value ); $j++ )
     echo "<img src = ./images/" . $value[ $j ] . ".gif>"; 
?> 
という具合になる.

昨日,今日,累計を表示するやつ

これはチョット凝っている. 昨日のアクセス数,今日のアクセス数,累計のアクセス数を別個に表示する. いろいろやり方はあろうが,以下のようにすればとりあえずできる.

昨日,今日,累計を記録するデータファイルをそれぞれ yesterday.dat,today.dat,access.dat とする. これらのファイルを読み込んで表示すればよい. 本日と累計のデータファイルは読み取り・書き込みモードで開くが, 昨日のデータファイルは読み取りモードで開く.

<?php
// 累計の来訪者数を取得
 $datafile = './access.dat';
 $fp = fopen( $datafile, "r+" );
 $cnt = fgets( $fp, 64 );
 $cnt = $cnt + 1;
 fseek( $fp, 0 );
 flock( $fp, 2 );
 fwrite( $fp, $cnt );
 fclose( $fp );

// 本日の来訪者数を取得
 $fp = fopen( "./today.dat", "r+" );
 $today = fgets( $fp, 64 );
 $today = $today + 1;
 fseek( $fp, 0 );
 flock( $fp, 2 );
 fwrite( $fp, $today );
 fclose( $fp );

// 昨日の来訪者数を取得
 $filename = "./yesterday.dat";
 if ( file_exists( $filename ) ){
    $fp = fopen( $filename, "r" );
    $yesterday = fgets( $fp, 64 );
    fclose( $fp );
 }
?>
ただし,これだけでは日付が変わっても何も変化しないので,日付が変わるたびに today.dat を yesterday.dat にリネームし,カウント 0 の today.dat を新たに作成する必要がある. このようなコードを PHP で書き Web ページに埋め込んでもよいが,アクセスが無い限り実行されないので シェルスクリプトを作って自動実行デーモン crond に実行してもらうのがよかろう.

今回は次のようなシェルスクリプトを作った.

#!/bin/sh

rootdir="/home/akasaka/public_html/lecture"

date "+%Y%m%d" >> $rootdir/daily.dat
cat $rootdir/today.dat >> $rootdir/daily.dat

mv $rootdir/today.dat $rootdir/yesterday.dat
cp $rootdir/origin.dat $rootdir/today.dat
chmod 666 $rootdir/today.dat

daily.dat は日ごとのアクセス数を記録しておくファイルである. 毎日のアクセス数が
20040206
24
20040207
2
20040208
1
20040209
27
のような書式で記録されてゆく. date コマンドと cat コマンドのリダイレクトを使っている.

次に today.dat を yesterday.dat にリネームし, origin.dat を today.dat にコピーする. origin.dat はカウンタの初期状態(数字の "0")だけが記録されたファイルである. 最後に today.dat のパーミッションを変更して終わりである.

シェルスクリプトの名前が changefile だとすると,毎日0時0分に changefile を 実行するように crond に登録するには,

$ crontab -e
とすると vi が起動するので,
0 0 * * * /home/akasaka/public_html/lecture/changefile
と入力し,保存する. きちんと設定されたかを確認するには crontab -l を実行すればよい.
$ crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.12171 installed on Mon Feb  9 19:56:00 2004)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
0 0 * * * /home/akasaka/public_html/lecture/changefile

daily.datを表示させる

ついでに,先の daily.dat を表示させるPHPスクリプトも作った. 毎日のアクセス数を棒グラフで表示する.

<table border = "1">
<?php
  $filename = "./daily.dat";
  $fp = fopen( $filename, "r" );
  $cnt = 1;
  while ( !feof ( $fp ) ) {
     if ( ( $cnt % 2 ) == 1 ){
        $datestr = fgets( $fp, 128 );
        if ( $datestr <> "" ) {
           $year = substr( $datestr, 0, 4 );
           $month = substr( $datestr, 4, 2 );
           $day = substr( $datestr, 6, 2 );
           $dayofweek = date( "D", mktime( 1, 1, 1, $month, $day, $year ) );
           echo "<tr><td>" . $year . "年" . $month . "月" . $day . "日 (" . $dayofweek . ")</td>";
        }
     }
     else {
        $visitors = rtrim( fgets( $fp, 128 ) );
        echo "<td>";
        for ( $i = 1; $i <= $visitors; $i++ ){
           echo "<img src=\"bar.jpg\">";
        }
        echo " ". $visitors . "人</td></tr>";
     }
     $cnt = $cnt + 1;
  }
  fclose( $fp );
?> 
</table>
表示結果はこんな感じだ.


お問い合わせはメールにて: akasaka@klc.ac.jp

戻る
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送