前回の日記
でログの保存方法をテキストファイルで行い、一覧表時用に集計したファイルを別途作成する事にしました。
しかし、テストしていて感じたのが「テキストファイルで集計するのは困難だ」と言う事です。
単に集計した値を追加するだけならテキストファイルでも良いのですが、「元の値を変更」する可能性があります。
特に「表示ファイル」や「ユーザーエージェント」などは、利用者も多いです。毎日加算すべき内容です。
しかし、テキストファイルで更新・編集を実現するには一筋縄ではいきません。
以下のような複雑な手順・考え方が必要になります。
○元ファイルを読み込み
○ファイル内に追加するデータ(文字列)が存在するか調べる
└存在する場合 → 元ファイルから1行ずつ取り出して、一致するかIFで比較
一致する場合は、値の部分を取り出す。
そして加算する値を加えて文字列を結合し、置き換える事で変更※
└存在しない場合 → 元ファイルを読み込んで最後の行に追加
※一致した行が以下の場合
$line には「localhost,5」が入っているとする。意味としてはlocalhostというホスト名のユーザが5回アクセスした
$ip_line = explode(",",$line); // カンマで分割
$ip_new = $ip_line[0].",".$ip_line[1]+$num; // $numは加算する値。例として5が代入されているとする
$str = str_replace($line,$ip_new,$file); // $lineを$ip_newに置換
と言う事を行えば、テキストファイル内の指定文字列の値を変更する事が出来ます。
この例文で言うと、「localhost,10」に置き換わり、見た目上は「元の値に+5されている」と読み取れます。
と言うように、文字で現すにしても非常に説明しづらく、ややこしい処理が発生します。
それが、「年」「月」「日」「時」「ホスト名」「IPアドレス」「リンク元」「表示ファイル」…の集計というように多くなると、
とてもテキストファイルに集計結果を保存するのは困難に感じました。
と言うわけで、集計結果はデータベースで管理する事にします。
SQLiteだとログを削除する時に(特別な事をしないと)ファイルサイズが肥大化したままになるので、MySQLを使おうと思います。
いくら集計用のファイルでも、ログの整理は必要です。
例えば毎日1000人がサイトに訪れると、1年で最低365,000レコードを使用する事になります。
もし、複数サイトで利用出来るアクセス解析を作ろうとした場合、比例してそのレコード数が増えてしまいます。
ですので、「保存は1年まで」と言うように期限を決めて、期限を過ぎた場合はレコードを削除した方がよいでしょう。
一旦データベースに入れれば、後から集計用のテキストファイルを作成するのは容易なので、1年前になるファイルはテキストとして出力するのも良いかもしれません。
ちょっとわかりづらい記事になりましたが、、後ほど修正しつつ、次回は表示面について考えたいと思います。
しかし、テストしていて感じたのが「テキストファイルで集計するのは困難だ」と言う事です。
単に集計した値を追加するだけならテキストファイルでも良いのですが、「元の値を変更」する可能性があります。
特に「表示ファイル」や「ユーザーエージェント」などは、利用者も多いです。毎日加算すべき内容です。
しかし、テキストファイルで更新・編集を実現するには一筋縄ではいきません。
以下のような複雑な手順・考え方が必要になります。
○元ファイルを読み込み
○ファイル内に追加するデータ(文字列)が存在するか調べる
└存在する場合 → 元ファイルから1行ずつ取り出して、一致するかIFで比較
一致する場合は、値の部分を取り出す。
そして加算する値を加えて文字列を結合し、置き換える事で変更※
└存在しない場合 → 元ファイルを読み込んで最後の行に追加
※一致した行が以下の場合
$line には「localhost,5」が入っているとする。意味としてはlocalhostというホスト名のユーザが5回アクセスした
$ip_line = explode(",",$line); // カンマで分割
$ip_new = $ip_line[0].",".$ip_line[1]+$num; // $numは加算する値。例として5が代入されているとする
$str = str_replace($line,$ip_new,$file); // $lineを$ip_newに置換
と言う事を行えば、テキストファイル内の指定文字列の値を変更する事が出来ます。
この例文で言うと、「localhost,10」に置き換わり、見た目上は「元の値に+5されている」と読み取れます。
と言うように、文字で現すにしても非常に説明しづらく、ややこしい処理が発生します。
それが、「年」「月」「日」「時」「ホスト名」「IPアドレス」「リンク元」「表示ファイル」…の集計というように多くなると、
とてもテキストファイルに集計結果を保存するのは困難に感じました。
と言うわけで、集計結果はデータベースで管理する事にします。
SQLiteだとログを削除する時に(特別な事をしないと)ファイルサイズが肥大化したままになるので、MySQLを使おうと思います。
いくら集計用のファイルでも、ログの整理は必要です。
例えば毎日1000人がサイトに訪れると、1年で最低365,000レコードを使用する事になります。
もし、複数サイトで利用出来るアクセス解析を作ろうとした場合、比例してそのレコード数が増えてしまいます。
ですので、「保存は1年まで」と言うように期限を決めて、期限を過ぎた場合はレコードを削除した方がよいでしょう。
一旦データベースに入れれば、後から集計用のテキストファイルを作成するのは容易なので、1年前になるファイルはテキストとして出力するのも良いかもしれません。
ちょっとわかりづらい記事になりましたが、、後ほど修正しつつ、次回は表示面について考えたいと思います。