6

記事やビデオのページビューをデータベースに保存することについては多くの議論がありますが、毎日のページビューを保存することに関する情報が見つからないようです。たとえば、DeviantArtは、過去15日間ほど、それぞれが取得したページビューの数、およびプロファイルの合計ページビューを表示します。

ページビューの例

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

PHPとMySQLでCodeIgniterを使用しています

4

3 に答える 3

6

通常、これらの場合に行うことは、ビューごとに1つのレコードを持つロギングテーブルを用意することです。一定の間隔(毎日)でcronを実行して、ログデータを別の要約テーブルに要約します。最も基本的なレベルでは、合計ビュー数を含むサマリーテーブルに1日あたり1つのレコードがあります。履歴データは変更されないため、更新する必要はありません。これにより、アイテムあたり年間最大365レコードが得られます。レコードはそれほど多くないので、適切にスケーリングされます。

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

次に、要約テーブルから選択して1日のカウントを取得できます。また、現在の日数を表示する場合は、ログテーブルから選択できます。

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

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

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

于 2012-12-01T14:53:26.820 に答える
5

毎日の行を作成し、それが表示されたときにカウントを増やすことができます。

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

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

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

これは、「views」と呼ばれるテーブルと2行の「day」と「views」を使用します。

詳細については、この記事を参照してください。

于 2012-12-01T14:36:33.290 に答える
4

私はcodeIgniterを使用していませんが、ストレートphpでこれを行う方法は次のとおりです。

基本的に、セッションを使用してサイトへの各訪問を記録し、ページリクエストを記録するか、ページの各ヒットを記録することができます。最初のオプションは、より多くの情報(行われた一意のヒットの数、リピーターからのヒットの数など)を提供しますが、セットアップに多くのプログラミングが必要であり、ユーザーセッション管理が必要です。それで、あなたの目的のために、私はオプション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キャンバスを使用して表示できます。または、各ヒットには日時があるため、さらに1日の時間などに分割できます。

これがお役に立てば幸いです。


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

合計ビュー数については、おそらく同じ列で別のテーブルを作成しますが、日時列では作成しません。次に、ページで、新しいテーブルの現在のページのビュー値もインクリメントします。

これは速く軽くなるでしょう。トレードオフは、詳細が失われることです。したがって、この3番目のオプションの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.
于 2012-12-01T14:02:55.627 に答える