著者は、 Apache Software Foundation を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

ヒットカウンターは、Webページが受信した訪問数を記録および表示するアプリケーションです。 カウンターは1から始まり、Webページにアクセスするたびに1つずつ増加します。

訪問を追跡するために、ヒットカウンターアプリケーションにはデータベースの形式が必要です。 MySQLのようなディスクベースのデータベース管理システムは機能しますが、インメモリデータベースは、速度、パフォーマンス、スケーラビリティ、シンプルさ、および使いやすさの点で優れています。 ここで、Redisサーバーが機能します。 Redisは、入出力操作を実行するたびにディスクにアクセスするのではなく、コンピューターのRAMにデータを保存します。 これにより、スループットが大幅に向上します。

サイトへのアクセスを追跡するには、Redisハッシュマップが必要です。 これは、キーと値のペアを実装するデータ構造です。 ハッシュマップは、キーを値にマップするハッシュテーブルを提供します。 ユーザーがWebページにアクセスしたら、パブリックIPアドレスまたはユーザー名(認証されたユーザーの場合)に基づいてキーを作成し、合計アクセス数を1に初期化します。 次に、ユーザーがWebページに再度アクセスするたびに、IPアドレス/ユーザー名に基づいてRedisハッシュマップから合計アクセス数を確認し、値をインクリメントします。

このガイドでは、Ubuntu20.04サーバーでRedisとPHPを使用してWebサイトのヒットカウンターを設定します。 このガイドのPHPスクリプトは、訪問者のパブリックIPアドレスを使用して訪問を追跡します。

前提条件

このガイドに従うには、次のものがあることを確認してください。

ステップ1—PHPRedis拡張機能をインストールする

このステップでは、PHPがRedisサーバーと通信できるようにするRedis拡張機能をインストールします。 また、Web訪問を追跡するためにRedisハッシュマップを実装するテストWebページを作成します。

Redis拡張機能をインストールする前に、Ubuntuパッケージ情報インデックスを更新してください。

  1. sudo apt update

次に、次のコマンドを実行してインストールします php-redis. この拡張機能は、RedisサーバーのKey-Valueストアと通信するためのAPIを提供します。

  1. sudo apt install -y php-redis

Apacheを再起動して、新しい拡張機能をロードします。

  1. sudo systemctl restart apache2

これで、Redisサーバーと通信するPHP拡張機能がインストールされました。 次に、を作成します test.php ApacheWebサーバーのルートディレクトリの下にあるWebページ。 これは、訪問者がブラウザを使用してWebサイトにアクセスしたときに要求するサンプルファイルです。 ボンネットの下で、 test.php ページファイルは hit_counter.php 後でRedisサーバーを使用してページアクセスを追跡するために作成するスクリプト。

実際のシナリオでは、Webサイトに数十または数百のWebページが含まれる場合があります。 このガイドでは、デモンストレーション用に1つのWebページを設定します。

ターミナルウィンドウで、 nano 新しいを作成するには test.php Webサーバーのルートディレクトリの下にあるファイル /var/www/html/:

  1. sudo nano /var/www/html/test.php

次に、次の情報をに入力します test.php ファイル:

/var/www/html/test.php
<?php
  require_once 'hit_counter.php';
?>

<!DOCTYPE html>
<html>

  <head>
    <title>Sample Test Page</title>
  </head>

  <body>
    <h1>Sample test page</h1>
    <p>This is a sample test page.</p>
  </body>

</html>

編集が終わったら、ファイルを保存して閉じます。 このステップでは、以下をロードする単純なHTMLWebページを作成しました。 hit_counter.php 訪問したときにファイル。 次に、 hit_counter.php テストページの訪問を追跡するためのファイル。

ステップ2—Redisヒットカウンタースクリプトを作成する

実稼働環境で作業する場合、再利用可能なPHPファイルを分離することは非常に一般的です。 これにより、コードをコピーして貼り付ける代わりに、パスを含めるだけで、プロジェクトのさまざまな部分にこれらのファイルのロジックを実装できます。 これにより、ロジックを変更する必要がある場合に1つのファイルを編集するだけで済むため、メンテナンスが容易になります。 これにより、時間を大幅に節約できます。

このガイドでも同じ戦略を適用します。 シングルを作成します hit_counter.php 訪問者の追跡が必要なWebページに含めることができるファイル。

このファイルでは、 php-redis PHPからRedisサーバーに接続するためのライブラリ。 次に、Redisハッシュマップを作成して、訪問者がWebサイトにアクセスした回数を保存します。 訪問者の一意のIPアドレスをRedisキーとして使用して、Redisサーバーでの各訪問者のヒット数を区別します。

ターミナルウィンドウで、新しい hit_counter.php を使用してファイル nano 編集目的:

  1. sudo nano /var/www/html/hit_counter.php

とともに hit_counter.php ファイルが作成されました。新しいPHPタグを開きます <?php. 次に、内部 try { ブロック次のコードを入力して、ポートでローカルRedisサーバーに接続します 6379. 交換 EXAMPLE_PASSWORD Redisサーバーの認証パスワードを使用する場合:

/var/www/html/hit_counter.php

<?php

    try {

        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis->auth('EXAMPLE_PASSWORD');

次に、Redisハッシュマップを与えます($siteVisitsMap)お好みの名前。 このガイドでは siteStats デモンストレーション目的:

/var/www/html/hit_counter.php

        $siteVisitsMap = 'siteStats';

Redisハッシュマップを定義した後、空のRedisキーを初期化します($visitorHashKey). 次に、訪問者のIPアドレスを入力します。 の値を使用します $visitorHashKey Webページを要求する各訪問者を一意に識別する変数:

/var/www/html/hit_counter.php


        $visitorHashKey = '';           

        if (!empty($_SERVER['HTTP_CLIENT_IP'])) {

            $visitorHashKey = $_SERVER['HTTP_CLIENT_IP'];

        } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {

            $visitorHashKey = $_SERVER['HTTP_X_FORWARDED_FOR'];

        } else {

            $visitorHashKey = $_SERVER['REMOTE_ADDR'];
        }

このコードでは、PHPを使用しています if 次のことを確認して訪問者のIPアドレスを決定するステートメント $_SERVER['HTTP_CLIENT_IP'], $_SERVER['HTTP_X_FORWARDED_FOR']、 また $_SERVER['REMOTE_ADDR'] 変数が入力されます。

これに続いて、 $totalVisits 各IPアドレスの合計訪問数を格納し、それに値0を割り当てる変数。 次に、PHPを使用します if (...) {...} else {...}$redis->hExists($siteVisitsMap, $visitorHashKey) IPアドレスにRedisサーバーにエントリがあるかどうかを確認するステートメント。

ステートメントを使用します if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {...} かどうかを確認するには $visitorHashKey 名前の付いたマップに存在します $siteVisitsMap.

指定されたIPアドレスを持つマップとキーがRedisサーバーに存在する場合は、ステートメントを使用してそれを取得します $visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey)); と使用 $totalVisits = $visitorData[$visitorHashKey] + 1; インクリメントするには $totalVisits 変数。 使用している $redis->hMget IPアドレスに関連付けられたヒットカウントデータを取得するステートメント。 The hMget 関数はマップの名前を受け入れます($siteVisitsMap)およびRedisサーバーから取得するキーの配列。 この場合、キーは1つだけです($visitorHashKey)、ただし、ステートメントを使用して配列に変換する必要があります array($visitorHashKey).

スクリプトが初めてIPアドレスに遭遇した場合は、 $totalVisits 1に可変。 最後に、 $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits); の値を設定するには $visitorHashKey 前の結果によると if (...) {...} else {...} 声明。 The $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits) ステートメントは、 $siteVisitsMap 名前付きのキーを持つRedisサーバーのハッシュマップ $visitorHashKey の値で $totalVisits.

次に、総訪問数をエコーして訪問者を歓迎し、 } catch (...) {...} ブロック:

/var/www/html/hit_counter.php

        $totalVisits = 0;

        if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {

            $visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey));
            $totalVisits = $visitorData[$visitorHashKey] + 1;

        } else {

            $totalVisits = 1;

        }

        $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);

        echo "Welcome, you've visited this page " .  $totalVisits . " times\n";

    } catch (Exception $e) {
        echo $e->getMessage();
    }

完了すると、 /var/www/html/hit_counter.php ファイルは次のコードのようになります。

/var/www/html/hit_counter.php

<?php

    try {

        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis->auth('EXAMPLE_PASSWORD');

        $siteVisitsMap  = 'siteStats';
        $visitorHashKey = '';           

        if (!empty($_SERVER['HTTP_CLIENT_IP'])) {

           $visitorHashKey = $_SERVER['HTTP_CLIENT_IP'];

        } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {

           $visitorHashKey = $_SERVER['HTTP_X_FORWARDED_FOR'];

        } else {

           $visitorHashKey = $_SERVER['REMOTE_ADDR'];
        }
      
        $totalVisits = 0;

        if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {

            $visitorData = $redis->hMget($siteVisitsMap,  array($visitorHashKey));
            $totalVisits = $visitorData[$visitorHashKey] + 1;

        } else {

            $totalVisits = 1;

        }

        $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);

        echo "Welcome, you've visited this page " .  $totalVisits . " times\n";

    } catch (Exception $e) {
        echo $e->getMessage();
    }

編集が終わったら、ファイルを保存して閉じます。 これで、 hit_counter.php 脚本。 次に、Redisハッシュマップで収集されたデータからレポートを生成する別のPHPスクリプトを作成します。

ステップ3—サイト統計レポートスクリプトの作成

Redisハッシュマップにデータを収集した後、レポートで情報を取得して表すことができない場合は、意味がない可能性があります。 このステップでは、ログレポートを作成して、さまざまなサイト訪問者と、テストWebページでの合計訪問数を示します。

ログレポートスクリプトを作成するには、 nano ターミナルウィンドウで新しいを作成します /var/www/html/log_report.php ファイル:

  1. sudo nano /var/www/html/log_report.php

次に、以下の情報をファイルに入力します。 交換 EXAMPLE_PASSWORD Redisサーバーの正しいパスワードを使用します。

/var/www/html/log.php

<!DOCTYPE html>
<html>

  <head>
    <title>Site Visits Report</title>
  </head>

  <body>

      <h1>Site Visits Report</h1>

      <table border = '1'>
        <tr>
          <th>No.</th>
          <th>Visitor</th>
          <th>Total Visits</th>
        </tr>

        <?php

            try {

                $redis = new Redis();
                $redis->connect('127.0.0.1', 6379);
                $redis->auth('EXAMPLE_PASSWORD');

                $siteVisitsMap = 'siteStats';                          

                $siteStats = $redis->HGETALL($siteVisitsMap);

                $i = 1; 

                foreach ($siteStats as $visitor => $totalVisits) {

                    echo "<tr>";
                      echo "<td align = 'left'>"   . $i . "."     . "</td>";
                      echo "<td align = 'left'>"   . $visitor     . "</td>";
                      echo "<td align = 'right'>"  . $totalVisits . "</td>";
                    echo "</tr>";
                    
                    $i++;
                }

            } catch (Exception $e) {
                echo $e->getMessage();
            }

        ?>

      </table>
  </body>

</html>

編集が終わったら、ファイルを保存して閉じます。 上記のスクリプトでは、Redisサーバーに接続しており、ステートメントを使用しています $redis->HGETALL($siteVisitsMap); Webページの訪問のハッシュマップを取得します。 次に、PHPを使用しています foreach ($siteStats as $visitor => $totalVisits) { 訪問者のIPアドレスとサイトへの訪問数をループして表示するステートメント。 Redisを使用しています HGETALL すべてのフィールド(IPアドレス)と値(各IPアドレスあたりの合計訪問数)をから取得するコマンド siteVisitsMap 地図。

これで、サイトの統計を確認するためのテストページ、ヒットカウンタースクリプト、およびレポートページができました。 次に、ヒットカウンターの機能をテストし、すべてが機能するかどうかを確認します。

ステップ4—Redisヒットカウンターをテストする

このステップでは、ヒットカウンターのロジック全体をテストします。 Webブラウザで次のURLに移動します。 交換 your-server-IP サーバーのパブリックIPアドレスまたはドメイン名を使用します。

http://your-server-IP/test.php

十分な統計を生成するために、さまざまなデバイスを使用してページを数回更新します。 訪問するたびに、次の出力が表示されます。

次に、次のURLにアクセスして、サイト訪問レポートをHTMLテーブルに表示します。

http://your-server-IP/log_report.php

次の出力のようなレポートが表示されます。

これで、ヒットカウンターが期待どおりに機能しています。

結論

このガイドでは、Ubuntu20.04サーバーでRedisとPHPを使用してWebサイトのヒットカウンターを設定しました。

このガイドのサンプルソースコードからわかるように、Redisはハッシュマップを作成および更新するためのよりクリーンなメソッドを提供します。

このガイドの冒頭で述べたように、リレーショナルデータベース管理システムの使用は引き続き機能する可能性がありますが、基になるテーブルにデータを挿入および更新するための大量のコードを記述します。 さらに、ディスクベースのデータベースでは、サイトが大きくなるとスケーラビリティの問題が発生する可能性があります。

Redisインメモリデータベースの使用の詳細については、以下のガイドに従ってください。