PHPでアクセスカウンターを作ってみました。
いわゆる昨日・今日・合計形式のテキストカウンターです。
【追記】このスクリプトの改訂版を掲載しました。(2014/01/29)
http://webmaster.chielog.com/php/182.html
作ったといっても一から作るのではなく、レッツPHP!さんの昨日・今日カウンターをカスタマイズしてみました。
カスタマイズといっても大分変更してシンプルにしてあります。
<?php //ログファイルcount.logの形式は1行のみで以下の通り。 //今日の日付け|昨日のカウント|今日のカウント|合計カウント //例:20120101|07777|05555|09999999 $now_date = date('Ymd') ; // 今日の日付 $yes_date = date('Ymd', strtotime('-1 day')) ; // 昨日の日付 // カウンタ記録ファイル $count_log = 'count.log' ; $dat = file($count_log) ; //ログを配列に読み込む if (!empty($dat)) { //変数を展開(比較用日付、昨日、今日、総合) list($key, $yes, $tod, $all) = explode("|", $dat[0]) ; if ($key === $now_date) { //ログの日付が今日ならカウントアップ $tod++ ; } elseif ($key === $yes_date) { //日付がかわったら昨日に今日を、今日に1を入れる。 $yes = $tod ; $tod = 1 ; } $all++ ; //合計カウントアップ //桁数整形 $yes = sprintf("%05d", $yes) ; $tod = sprintf("%05d", $tod) ; $all = sprintf("%08d", $all) ; //ファイル更新 $new = implode("|", array($now_date,$yes,$tod,$all)) ; $fp = fopen($count_log, "r+") ; flock($fp, LOCK_EX) ; fputs($fp, $new) ; fclose($fp) ; } echo $all.'|' ; echo $tod.'|' ; echo $yes ; //end
こんな感じです。
レッツPHPさんとの違いは、
- 画像を無くし、テキストオンリーにしたこと
- fopen関数をwモードではなくr+モードにしたこと
- 桁数を整形してからファイルに書き出ししていること
- 日付変更時のロジックを簡略化
などなどです。
カスタマイズの理由は、
- テキストのみの方が軽い
- fopenをwモードで処理するとファイルが壊れる(ファイルが空になる瞬間あるため)
- 先に桁数を整形した方が、日付変更時に桁数違いのバグが出ない
- 三項演算子の処理が不要だったので簡略化
というわけです。
アクセスカウンターを作成している人の参考までに。
なお、スクリプトのご利用は自己責任でお願いします。
fopen関数とfputs関数の仕様についての関連記事
http://webmaster.chielog.com/php/125.html
合計は正常に加算されるんですが、今日のカウントが1と2を繰り返すのはこちらの環境が悪いんでしょうか。
何かヒントいただければ嬉しいです。
ピンバック: 【PHP】昨日・今日・合計のカウンタースクリプト【改訂版】 | WEBマスターの知恵ブログ
コメントありがとうございます。
長谷川様の環境および実行コードが不明なので、参考になるようこちらで改訂版として新たにカウンタースクリプトの記事を投稿しました。
ご参考までにどうぞ。
http://webmaster.chielog.com/php/182.html
お返事ありがとうございます。
おかげさまで無事にカウントできました。
こちらの環境はWindowsXPにApacheで、PHPは5.2という環境です。
もしかしたら最初に作成したカウントデータ用のテキストファイルの内容が変だったのかもしれません。
本当にありがとうございました。
解決されたようでよかったです。
自分もコードの見直しができて助かりました。