- ベストアンサー
URLパラメータで表示するページのアクセスカウンタ
- PHPで誰でも投稿できる記事サイトの制作を勉強中です。pdoでMySQLデータベースに接続しています。
- 記事を表示するページの仕組みとして、URLパラメータに各記事のコードを含ませ、データベースからコードで照合したレコードのデータを取得し、取得したデータ(タイトル・内容・作成者の名前)を表示するという形でページを作成しています。
- アクセスランキングの作成のために、各記事ごとにアクセス数を集計したく、データベースにアクセスカウント用のカラムを作成し、ページに人が訪問したらカウンタを更新するという形で試しに実装してみました。また、日別のアクセス数もカウントしたいため、毎日、日ごとのアクセスカウント用のカラムを1つずつ増やすのは少し手間がかかる気がします。テキストファイルでカウントする仕組みを見つけたのですが、1つのテキストファイルに複数ページのカウントを書き込むことは可能でしょうか?また、GETでページ分けされている場合のアクセスカウンタの処理方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> こちらについてですが、やはり、アクセスが多い場合はテキストファイルのほうが良いということでしょうか? > okwaveのように沢山の人が一度に色々な質問ページを見るような場合はテキストファイル管理の方が良い感じでしょうか。 アクセスカウンターの利用方法とコストの問題も絡みます。 DBサーバに十分お金を掛けられるなら、DBでやった方が後々楽なのでDBがいいと判断します。 一方、アクセスカウンターがリアルタイム更新で無く前日のアクセス数が分る程度でいいなら、テキストファイルにアクセスログだけを記録しておき、一日一回まとめて集計して結果だけDBに入れておくといった処理方法も考えられます。 なので、アクセス数、データの利用方法、予算などいろんな条件を加味して最適なものを選ぶといった所ですね。 > ない場合は新たにレコードの追加。 > 既に存在する場合はアクセス数のカラムに1足すという感じで > if文で分岐させる感じですが、 > 他に良い処理方法はあるでしょうか? RDBMSの種類によっていろいろ手法があり、「MERGE INTO ・・・」を使ったり「INSERT ・・・ ON DUPLICATE KEY UPDATE ・・・」を使ったりとDBに任せることも可能です。
その他の回答 (3)
- Taiyonoshizuku
- ベストアンサー率37% (183/489)
>私の思いつく処理だと、 >記事番号と日付を条件にレコードを取得し、 >ない場合は新たにレコードの追加。 >既に存在する場合はアクセス数のカラムに1足すという感じで >if文で分岐させる感じですが、 >他に良い処理方法はあるでしょうか? http://www.united-bears.co.jp/blog/archives/2792 こちらを参考にどうぞ on duplicate key updateという機能があるよ。 データがあればupdateなければinsertを勝手にしてくれる。
お礼
ご回答と参考URLありがとうございます! on duplicate key updateは知りませんでした・・・ この機能を使えば色々なUPDATE処理が楽になりますね! 非常に良いご回答をくださったのですが、 他の方の回答と甲乙つけがたいため、 今回は先に回答をくださった方をベストアンサーとしたいと思います。 ご回答ありがとうございました!
- Taiyonoshizuku
- ベストアンサー率37% (183/489)
いやいや、DB使ってるのにテキストファイルに落とし込むのはもったいないよ。 普通(?)はデータを縦に持つ。 カウント用のテーブルを別に作るってこと。 記事テーブルのキーで紐付くように設計してね。 例えばACCESS_COUNTっていうテーブルを以下のように作る。 key,count,date こうすればA記事初回アクセスされた場合に以下のレコードを作成する。記事キーと日付をキーとする。 A,1,2015-02-26 次にA記事にアクセスがあった場合、カウントを+1してupdate A,2,2015-02-26 こうすればカラムなんかいじらなくても日ごとの集計もできるようになる 例えば明日になったときのA記事アクセス時は A,1,2015-02-27 というレコードが作成されるから。 集計したければ ACCESS_COUNTテーブルに集計したい条件でSQLを発行すればよし。 何が何でも縦に持つことは無いけど、カラムを増やすよりは別のテーブルに持つように設計したほうがいろいろできることは多い。 (もちろん横に伸ばさざるをえないこともあるけど)
- t_ohta
- ベストアンサー率38% (5238/13705)
データベースに負荷が掛かるのは書き込みの時なので、アクセス数が増えたらDBへの負荷は上がりますが、実際どの程度のアクセスを想定されているかでDBがいいのかテキストファイルを使ったほうがいいのか判断が分かれます。 また、日付毎にアクセス数を取りたいのであれば、記事テーブルにカラムを追加するのではなく 「記事番号」「日付」「アクセス数」と言ったカラムを持ったアクセスカウンターテーブルを別途用意して記録を取るといいのではないでしょうか。 ファイルで記録する際ですが、fopen()関数はファイルが無い場合作成してくれますので、予め用意する必要はありません。 一つのファイルに複数の記事のカウンターを書き込む事も可能でしょう。 CSV形式とかJSON形式とか文字列でデータを管理する方法はいくらでもあるので、管理は可能です。 ただ、複雑な管理(日毎だとか)をするのであれば、テキストファイルは徐々にオーバーヘッドが大きくなってくるのでDBを使用した方が処理が早くなります。
補足
早急で丁寧なご回答ありがとうございます! >データベースに負荷が掛かるのは書き込みの時なので、アクセス数が増え >たらDBへの負荷は上がりますが、実際どの程度のアクセスを想定されて >いるかでDBがいいのかテキストファイルを使ったほうがいいのか判断が >分かれます。 こちらについてですが、やはり、アクセスが多い場合はテキストファイルのほうが良いということでしょうか? okwaveのように沢山の人が一度に色々な質問ページを見るような場合はテキストファイル管理の方が良い感じでしょうか。 >また、日付毎にアクセス数を取りたいのであれば、記事テーブルにカラム >を追加するのではなく >「記事番号」「日付」「アクセス数」と言ったカラムを持ったアクセスカ >ウンターテーブルを別途用意して記録を取るといいのではないでしょう >か。 なるほどです! と、なると日付が変わって初訪問の際に レコードを追加しなくてはいけないので、 私の思いつく処理だと、 記事番号と日付を条件にレコードを取得し、 ない場合は新たにレコードの追加。 既に存在する場合はアクセス数のカラムに1足すという感じで if文で分岐させる感じですが、 他に良い処理方法はあるでしょうか? >ただ、複雑な管理(日毎だとか)をするのであれば、テキストファイルは >徐々にオーバーヘッドが大きくなってくるのでDBを使用した方が処理が >早くなります。 DB処理の場合でもファイル処理の場合でも一長一短があるということですね。 非常に為になります! ご回答、よろしくお願いします。
お礼
ご回答ありがとうございます! なるほど、それぞれ一長一短あるので、 自分に向いた方法を取るべきということですね。 大変、参考になりました。