基本に忠実に、PHPでアクセスカウンタを作ってみた。
カウントアップするスクリプトと、カウンタを表示させるスクリプトは別。
カウントアップ用スクリプトはごく単純な二重読み込み防止機能を。
$countdat = "./countdat";
$hostfile = "./counthost";
$host = file($hostfile);
if($host[0] != $_SERVER['REMOTE_ADDR']){
$fp = fopen($countdat , "r+") or die();
flock($fp, LOCK_EX);
$count = fgets($fp);
$count = $count + 1;
rewind($fp);
fputs($fp, $count);
fclose($fp);
$fp = fopen($hostfile,"w") or die();
fputs($fp,$_SERVER['REMOTE_ADDR']);
fclose($fp);
}
?>
ホストファイルにカウントしたときのクライアントのIPアドレスを書いといて、
それを読んで同じ人なら何も処理なし。
来る人の少ないしょんぼりサイトでのみ役立つ二重読み込み防止機能。
うちはこれで充分。いいでしょ。
カウンタ表示はphpでpngを出力してやる。
//初期設定
$logfile = "./countdat";
$count = file($logfile); //数字
$count = str_pad($count[0],11,0,STR_PAD_LEFT); //11桁にゼロパディング
//枠作成
header("Content-Type: image/png");
$img = imagecreate(80,15); //とりあえず全体枠を
imagecolorallocate($img,180,180,180); //グレーで。
$color = imagecolorallocate($img,255,255,255); //白を指定して
imageline($img,1,1,1,13,$color); //縦の左枠を書く
imageline($img,78,1,78,13,$color); //右の枠を書く
imageline($img,1,1,78,1,$color); //上の横枠を書く
imageline($img,0,13,78,13,$color); //下の横枠を書く
$color = imagecolorallocate($img,0,0,0); //黒を指定して
imageline($img,0,0,0,14,$color); //縦の左枠を書く
imageline($img,79,0,79,14,$color); //右の枠を書く
imageline($img,0,0,79,0,$color); //上の横枠を書く
imageline($img,0,14,79,14,$color); //下の横枠を書く
$color = imagecolorallocate($img,255,255,255); //白を指定して
imageline($img,57,1,57,13,$color); //hitsの左の線
//文字入れ
$color = imagecolorallocate($img,0,0,0); //
imagestring($img,1,2,3,$count,$color);
imagestring($img,1,59,3,"hits",$color);
$color = imagecolorallocate($img,0,0,0); //黒
imagepng($img);
exit();
?>
右の枠内のバナーと並べて表示するために、リンクボタンと同じ80x15の画像で出力してやる。
ゼロパディングしてるのは虚仮威し。
スペースパディングの方がいいかも。
YSAK
俺もひそかにカウンタ追加してるのよ。
管理者しか見れないようにしてるけど・・・。
にゃるほど、IPで二重アクセス防止してるのか。
俺はセッション関数でやってますな。
要するにブラウザを落としてもう一度アクセスしてきたら
カウントする仕様です。
残念ながら数字は画像なんて使ってないけど。
俺には、そこまでこれない・・・。
げんき
まぁ、カウンタなんてそんな凝る必要無いですからね。
「リロードしたら数値が1上がった」ってのが一番不細工なんで、それさえ防げれば何でもいいんですよ。
画像なんて、凝るっつってもこの短いスクリプトだけですからねぇ。
vineの80x15の画像作るほうがよっぽど時間かかりましたよw