mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

PHP+MySQLでアクセスカウンタ!

[ webサイト, サーバ構築 ] [ MySQL, PHP ]

こんばんは。

今日は、 この間自分の ホームページ にテキストファイルを使った簡単なアクセスカウンタをPHPで作って稼働させてましたが、 やっぱりちゃんとしたもの、つまり、同じIPからのアクセスはある程度制限かけたり、データベースを使って動かしたり、ということがしてみたくなり、いろいろ調べながらやってみました。

導入にあたり、こちら「 DA実験室 :: PHP+MySQLのスクリプト配布 」 を参考にさせてもらいました。 ご参照下さい。

こちら では以下の3種類のカウンターがありますが、 今回は「 カウンター3 」を導入しました。

  • カウンター1
    単純にカウントするだけのカウンター。
    同ホスト連続アクセス検査用の機能も付いてます。
  • カウンター2
    カウンター1の機能に加え、昨日・今日の値もカウントできるように
    改良したカウンター。
  • カウンター3
    カウンター2の機能に加え、同ホスト連続アクセスの判定に
    制限時間を付けられます。制限時間を超えてアクセスした場合は、
    同ホストでもカウンターを更新します。

導入記録

1.サンプルソースダウンロード&展開

こちらの「 DA実験室 :: PHP+MySQLのスクリプト配布 」の ダウンロードページ から「 DACNT dacnt-2.1.zip 」をダウンロード&展開する。

2.データベース作成

今回使用するテーブルを作成するためにまずMySQLにデータベースを作成する。 コマンドプロンプトから行いました。 (phpMyAdminを使用してもOK)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
C:\mysql\bin>mysql -u root -p
Enter password: ***************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.0.67-community MySQL Community Edition (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database mkmode;  < - - - 例として mkmode を作成
Query OK, 1 row affected (0.01 sec)

mysql> grant all privileges on mkmode.* to ユーザ名@localhost identified by 'パスワード';  < - - - ユーザを作成
Query OK, 0 rows affected (0.03 sec)

mysql> exit
Bye

3.テーブル作成

ダウンロードしたファイルの中の「 dacnt3.sql 」を使用してテーブルを作成する。 当方はあらかじめ「 dacnt3.sql 」を「 C:\mysql\bin 」に置きました。 コマンドプロンプトから以下のようにする。

1
2
C:\mysql\bin>mysql -u root -p mkmode < dacnt3.sql
Enter password: ***************

テーブルが作成されたか確認してみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
C:\mysql\bin>mysql -u root -p mkmode
Enter password: ***************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 5.0.67-community MySQL Community Edition (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show tables;
+------------------+
| Tables_in_mkmode |
+------------------+
| dacounter3       |
+------------------+
1 row in set (0.01 sec)

mysql>

4.レコード作成

あらかじめテーブルにレコードを作成しておく。

1
2
3
4
mysql> INSERT INTO daCounter3 (name) VALUES ('cnt');
Query OK, 1 row affected (0.00 sec)

mysql>

5.PHPソースの修正

以下のPHPソースを自分の環境に合わせて修正する。

・「 dacnt.php 」

1
2
3
4
5
6
7
19: $dbHost    データベースのホスト名を記述します。
               通常は 'localhost' です。
22: $dbName    データベースの名前を記述します。
23: $dbUser    データベースのユーザー名を記述します。
24: $dbPass    データベースのパスワードを記述します。
27: $timediff  GMTとの時差を秒で記述します。
               日本は+9時間なので32400です。

・「 dacnt3.php 」

1
2
3
4
21: $tblName   使用するテーブルの名前を記述します。
        (実際には今回使用するテーブル「 daCounter3 」
33: $interval  制限時間を秒で記述します。
               標準は1800(30分)です。

6.ソースのアップロード

以下のソースをWebサーバ(ドキュメントルート)へアップロードする。 dacnt.php dacnt3.php

7.ソース作成

アクセスカウンタを埋め込むページのPHPソースに以下のように記述を追加する。 ※今回も数字は画像を使用するので、 ドキュメントルートの「 images/counter 」フォルダに 「 0.gif 」~「 9.gif 」を置いています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
open();

// 値を読み取るだけの場合
//$cnt->read('cnt');  < - - - 今回は使用しないのでコメントアウト

// 値を更新する場合 (単純カウント)
//$cnt->update('cnt');  < - - - 今回は使用しないのでコメントアウト

// 値を更新する場合 (IPアドレスで重複検査)
//$cnt->update('bbs', $REMOTE_ADDR);  < - - - 元のソースでは最近のPHPでは使えないので変更
$cnt->update('cnt', $_SERVER["REMOTE_ADDR"]);

// データベースを閉じる
$cnt->close();

// 値を取得して表示する例
echo '
<div>総計: ';
echo $cnt->makeImgTag( $cnt->getCount(), 6, 'images/counter/%d.gif', '%d' );
echo '</div>
';
echo '
<div>今日: ';
echo $cnt->makeImgTag( $cnt->getCountToday(), 6, 'images/counter/%d.gif', '%d' );
echo '</div>
';
echo '
<div>昨日: ';
echo $cnt->makeImgTag( $cnt->getCountYeday(), 6, 'images/counter/%d.gif', '%d' );
echo '</div>
';
//[テキスト形式ならこちら]
//echo '
<div>総計: '.$cnt->getCount().'</div>
';
//echo '
<div>今日: '.$cnt->getCountToday().'</div>
';
//echo '
<div>昨日: '.$cnt->getCountYeday().'</div>
';
?>

上記は基本です。 当方はさらに手を加えてデザイン変更もしています。

8.動作確認

うまくいけばこんな感じにできるはず。 ※今回は30分以上間をおかないと同じIPからのアクセスはカウントしないような設定にしています。

php_mysql_counter


以上で終わりのはずです。

※上記の設定手順はLinuxでもほぼ同じにできました。

とりあえず、これで様子をみてみようっと!

じゃ、また。

Comments