2012-12-01 14 views
5

記事やビデオのページビューをデータベースに保存することについてのディスカッションはありますが、毎日のページビューの保存に関する情報は見当たりません。たとえば、DeviantArtは、過去15日間、小さなグラフで各ページビューが取得された回数、およびプロファイルの合計ページビューを表示します。毎日のページビューと合計カウントを保存する最も効率的な方法

Pageviews example

あなたは、私が達成しようとしている、と彼らはヒット数百万を得るようがdeviantartは巨大な規模でそれを行うまさに上に見ることができます。

私はCodeIgniterのを使用しますが、ここにあなたがまっすぐPHPでこれを行うことができます方法ですしていないPHPとMySQLに

+0

私は自分の答えを更新しました。好奇心の外に、どのサイトですか?私はあなたが1日に何百万というヒットを期待しているのに驚いています。 – Marvin

+0

それは主に関心がありません、私は今のようなスクリプトを使用する必要はありませんが、私はいくつかの大きなサイトで作業を開始しているので、おそらく将来的にそれを必要とします:) – Adam

答えて

5

mysql_query("INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1;"); 

これは、 'ビュー' と2行 '日' と 'ビュー' と呼ばれるテーブルを使用しています

INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1; 

そしてPHPスクリプト...。

詳細については、this articleを参照してください。

4

をCodeIgniterのを使用しています。

基本的には、セッションを使用してサイトへの各訪問を記録し、ページリクエストを記録するか、単に各ヒットをページに記録することができます。最初のオプションは、より多くの情報(何回のユニークヒットが行われたか、リピート訪問者からのヒット数など)を提供しますが、セットアップにはさらに多くの時間がかかり、ユーザーセッション管理が必要です。だから、あなたの目的のために、私はオプション2.

SQL説明します:あなたが監視しているページで

Table 'pageViews' 
Id - Integer, auto Increment, primary key 
page - varchar(150) 
datetime - datetime 

を、あなたが追加します。

$query2 = "INSERT INTO `pageViews` (page, datetime) VALUES ('".$_SERVER["SCRIPT_NAME"]."', ".date("Y-M-d H:I:s").")"; 
    $result2 = //insert DB connection etc. to apply update to DB 

をあなたはその後、行をフェッチすることができますページと日付/時刻スタンプに基づいてデータベースから、結果を数え、html5キャンバスを使用して表示します。または、ヒットごとに日時が設定されているため、時間の経過とともにさらに時間を分解することができます。

これが役立ちます。


これを単純な毎日のカウンタに変更するには、「ビュー」という名前の追加の列を単なる整数として追加します。次に、ページに今日の現在のページの行がデータベースにあるかどうかを確認するチェックを入れます。そうであれば、現在のビューの値を取得し、それを増分してDBに再販します。

私はおそらく、同じ列を持つ別のテーブルを作成しますが、日付 - 時間列は作成しません。あなたのページでは、新しいテーブルの現在のページのビュー値をインクリメントします。

これは高速になるでしょう。トレードオフはディテールの損失です。だから、ここMySQLとPHPは、この第三のオプションのためです:

のMySQL:

Table 'dailyViews' 
Id - Integer, auto Increment, primary key 
views - integer 
page - varchar(150) 
datetime - datetime 

Table 'totalViews' 
Id - Integer, auto Increment, primary key 
views - integer 
page - varchar(150) 

PHP:あなたはそれを見たときに、その後カウントをインクリメント毎日の行を持つことができ

// Search the DB for an entry today for this page in dailyViews 
$query = "SELECT views FROM `dailyViews` WHERE `page`='".$_SERVER["SCRIPT_NAME"]."' AND `datetime`=".date("Y-M-d H:I:s").""; 
$result = //insert your db connection etc to execute the query 

if (mysqli_num_rows($result)==1) { 
    $resultArray = mysqli_fetch_array($result, MYSQLI_ASSOC); 
    $views = $resultArray['views']+1; 
    $query2 = "UPDATE `dailyViews` SET `views`=".$views." WHERE `page`='".$_SERVER["SCRIPT_NAME"]."' AND `datetime`=".date("Y-M-d H:I:s").""; 
    $result2 = //insert DB connection etc. to apply update to DB 
} else if (mysqli_num_rows($result)<1) { 
    $query2 = "INSERT INTO `dailyViews` (views, page, datetime) VALUES (1, '".$_SERVER["SCRIPT_NAME"]."', ".date("Y-M-d H:I:s").")"; 
    $result2 = //insert DB connection etc. to apply update to DB 
} else { 
    // there is more than one entry for this page and date in the DB. An error has ccurred 
} 

// Then just get the total views for this page and increase it by 1. 
+0

だからあなたは各ページビューの新しい行? 1日に数百万回のヒットを記録した巨大なサイトでは、それほど遅くならないでしょうか? – Adam

+0

サイトに依存しますが、それ以外の場合は1日あたりのヒット数は数百万であり、それ以外は一般的にはありません。行はバイト単位で非常に小さいので、応答は非常に速いです。私が提案した方法は、ページビューに関するより多くの情報を得るために容易に拡張可能である(時間ビュー数に分解するなど)。あなたが好きなのであれば、簡単な日替わりオプションを追加できます。 – Marvin

4

通常、これらのケースでは、1レコードあたり1レコードのロギングテーブルがあります。特定の間隔(毎日)でcronを実行して、ログデータを別のサマリーテーブルに要約します。最も基本的なレベルでは、合計ビュー数とともに1日あたり1レコードのサマリー・テーブルが作成されます。履歴データは決して変更されないので、更新を行う必要はありません。これは1年に最大365件のレコードを提供します。多くのレコードではないので、うまく拡張できます。

これは、毎日1つのレコードを持ち、カウントを更新するよりも優れています。同じレコードを複数回更新しようとすると、競合/ロックの問題が発生する可能性があります。 INSERT DELAYEDを実行し、MyISAMテーブルを使用することで、ロギングテーブルのスケールを非常に良くすることができます。

サマリー表から選択して日次カウントを取得し、現在の日数を表示する場合はロギング表から選択できます。

ロギングテーブルを小さくしたい場合は、cronを実行するときにロギングテーブルの名前を変更して空の新しいテーブルを作成できます。名前を変更したロギングテーブルを処理します。

RENAME TABLE logging TO logging_old;CREATE TABLE logging LIKE logging_old; 

実際にスケールする必要がある場合は、レプリケーショントリックを使用して非常に高速にビューを記録できます。ロギングデータにはBLACK HOLEテーブルタイプを使用します。このタイプは、テーブルがMyISAMまたはInnoDBである別のサーバに複製されます。

関連する問題