PHP+MySQLホームページアクセス解析ツール

製作: 小川 邦久

ご意見・ご感想

プライバシーポリシー

Copyright (C) 2010 KUNISAN.JP.
All Rights Reserved.


開発メモ


開発メモ[2010/08/02]
詳細データのIPアドレス欄の右隣に、ホスト名を表示するように変更。また、ホスト名別のアクセス数グラフ(PV、UV共)を追加した。バージョンを1.6とした。

開発メモ[2010/07/06]
エンコードを「UTF-8」とした場合に、詳細データの抽出欄に日本語を入力すると文字化けしてしまい、正しくデータが抽出できないバグがあったため、その部分を修正した。バージョンを1.5とした。

開発メモ[2010/07/03]
全体のアクセス数グラフに「年間推移」グラフ表示の機能を追加。バージョンを1.4とした。

開発メモ[2010/06/22]
自動アーカイブ機能や自動削除機能は全テーブルに対して一度に処理が行われるため、特にテーブル数が多い場合に一時的に負荷が高まってしまう。そのため、自動アーカイブ機能や自動削除機能の実行を、ID毎に分けて行うようにした。バージョンを1.3とした。

開発メモ[2010/03/21]
自動アーカイブ(前回の自動アーカイブ処理から24時間を超えた後、アクセス解析対象ページを踏むと起動)が設定されている場合に、データ量が多いとその分アーカイブ処理に時間がかかるが、その間に対象ページを踏むと多重に自動アーカイブ処理が起動して、アーカイブデータにダブリが出てしまうバグを発見。自動アーカイブ起動チェック用のタイムスタンプ書き換えが、「アーカイブ後」だったものを「アーカイブ前」に変更してタイムラグを無くした。また、これでも多重にアーカイブが起動する可能性はゼロではないので(手動アーカイブ+自動アーカイブ同時起動など。確率は限りなくゼロに近いが)、データ表示の上でもPVがダブっているものは、DISTINCT PVを使って1つしか表示しないようにした。バージョンを1.2とした。

開発メモ[2010/03/15]
PV、UV詳細画面等で、以前はIDにアーカイブテーブルを指定すると、強制的にアクティブテーブルと連結して表示させていたが、データ数が多くなると表示に時間がかかってしまう。そのため、アーカイブテーブル単独でも表示できるように修正した。またモジュールに「出口ページランキング」を追加。バージョンを1.1とした。

開発メモ[2010/03/10]
アクセス解析プログラムをセット(zip圧縮)としてWeb上に公開。バージョンを1.0とした。

開発メモ[2010/03/06]
データ自動削除機能を追加。データベース容量が限られているサービスにも対応するため。

開発メモ[2010/03/05]
テーブル画面設定編集ページを追加。表示・非表示、表示順、追加リンクなど、Web上で編集できるようになった。

開発メモ[2010/03/04]
管理画面トップのサイト名やリンクなどの表示設定をPHPに直接書き込む形から、データベースからテーブル設定データを取得する形に切り替えた。

開発メモ[2010/03/03]
処理のさらなる高速化&負荷減少のため、8日前以前のデータは自動的にアーカイブに移行するように設定。アーカイブ自動移行処理は24時間に1度の間隔で行われる。ただし、アーカイブ後にデータがゼロになるとPV値もリセットされてしまうので、アーカイブ後にデータゼロになってしまうような場合にはアーカイブしない処理もしてある。さらに詳細データからアーカイブを参照する際にはUNION ALLを使って、現在のデータ+アーカイブの両方のテーブルを連結して参照できるよう改良した。

開発メモ[2010/03/01]
データが貯まってきたせいか、時折CPU使用率が100%に達するようになってしまった。ブログパーツをアクセス解析の対象から外したところ、CPU使用率が平均30%強だったものが、平均7%まで落ちた。また、CPU使用率が100%に達することもなくなった。加えてデータの削除、アーカイブ化の機能を付けた。将来データが非常に多くなった際に対応するため。
あと、負荷の原因と思われるデータ蓄積処理の「2時間以内に…」というのを「同日内に…」という条件に変更した。クエリーキャッシュはWHERE条件が1文字でも変わると有効にならないので、時間と共にパラメーターが変化する「2時間以内(今から2時間前のタイムスタンプを指定し、それ以降)に…」よりは、その日のうちはパラメーターが変化しない「同日内に…」の方が、システムの負荷が小さくなると考えたことから。

開発メモ[2010/02/25]
管理画面トップで、データが8日分以上溜まった際に、7日より前のデータが表示されたり、日付の表示順が変になる不具合が発生。日別データ取得を、MySQLの日付関数で取得する方式から、タイムスタンプを86400での割り算(切り捨て)で取得して、PHPの日付関数で表示する方式に変更(PHPとMySQLで、時間関数の処理に若干の誤差があるため)。また、並びもUVで降順からTIMEで降順に変更。不具合改善の上、若干高速化にも繋がった。詳細画面の日付別グラフも修正。ただし、計算が煩雑になるため時間別、週別、曜日別、月別は未修正(若干誤差が出る可能性がある)。

開発メモ[2010/02/21]
参照元(REFERER)を素のまま取得するように変更。元々はJavaScriptでURIエンコードしたものをPHPでデコードしていたが、もとからエンコードされてあったアドレスの一部(サーチワードなど)が、PHPデコード後に日本語に変換されてしまうなど、正確な参照元アドレスを参照できない不具合が発生していたため。通常のGETでは「&」で切れてしまうため、Yahoo!、Google等のアドレスが途中で切れてしまう。そのため、データの区切りを「&&&」とした。全ホームページのコードを変更の上、UV詳細画面も変更。

開発メモ[2010/02/17]
テーブル分割で負荷が減ったおかげで、管理画面トップページからのアクセスも、カウンター用ログファイルを8日分x2(UV+PV)x数十サイト分読み込むよりも、直接データベースから読み込む方が早くなったため、そのように再変更した(要は元に戻した)。差分計算の場合には、アクセス無しが続くとデータ不具合があったが、直接データベースから読み込むことにより問題解消。

開発メモ[2010/02/16]
当初データテーブル1つだけで運営して、ID(サイト別に違う)でフィルタリングしてデータ蓄積・抽出する形だったが、ネットブックへの負荷が高く、タスクマネージャーで確認したところ、CPU使用率が100%に届き、数秒間フリーズしたような状態になることが多々あった。そのような時にアクセスがあると、PVが正確にカウントされず、トップ画面のPV値、UV値に最大50%程度の誤差が生じていた(IPデカ-ブログパーツ)。また、PV詳細画面、UV詳細画面、グラフについても表示い10秒ほど時間がかかっていた。実際には違うIDのデータ同士をリンクさせて計算することはないので、速度向上(負荷現象)の目的でIDの違うものはテーブルを完全に分けて、PVはauto_increment処理で確実にカウントするように変更した。これによりネットブックの負荷が激減した。改良前はCPU使用率が数十%と100%の間を行ったり来たりしていたが、改良後は通常10%前後、高負荷の状態でも(たまに)50%程度までになった。また、PV詳細画面、UV詳細画面、グラフなども一瞬で表示されるようになった。

開発メモ[2010/02/15]
当初、管理画面トップも直接MySQLにデータを問い合せる形だったが、10サイトほど設置しただけで20秒以上の時間がかかってしまったためアウト(PHP実行のタイムリミットは60秒)。
そのため、管理画面トップのアクセスログフォルダを作成して、その中のカウンター用ファイルを読み書き(読んで+1して書き出す)する形のページを作ったが、一日数千アクセス以上のレベルになると、恐らくファイル書き込み&読み込みがバッティングして、アクセス数ゼロになってしまう現象が多発してしまった。
そのため、カウンタープログラム実行時に、MySQLへの書き込みと、その際のUV、PVデータをそのままログファイルとして保存する形に変更。アクセスが無い日が続いた場合など、不正確な面もあるが、アクセス数の多いサイト(重要サイト)については問題ないので、現時点ではこれがベストの選択と思われる。