ホームページ > バックエンド開発 > PHPの問題 > PHPで簡単なリアルタイムランキング機能を実装する方法

PHPで簡単なリアルタイムランキング機能を実装する方法

PHPz
リリース: 2023-04-25 18:46:22
オリジナル
780 人が閲覧しました

インターネットの急速な発展に伴い、リアルタイム ランキングは多くの Web サイト、特にトラフィックが非常に多い Web サイトにとって必要な機能の 1 つになりました。たとえば、話題のニュース、ベストセラーの書籍、人気の製品などのリアルタイム リストは、さまざまな Web サイトでよく見られるものです。この記事では、PHP を使用して簡単なリアルタイム ランキング関数を実装する方法を紹介し、そのパフォーマンスを向上させる方法を検討します。

1. 機能紹介

リアルタイムリストは、現在最も注目されているリストや注目されているリストを表示する機能です。この記事では、訪問数に基づいたリアルタイムランキングを実装します。ユーザーがページにアクセスしたり、特定の操作を実行したりするたびに、そのページまたは操作のカウントを 1 ずつ増やし、リアルタイム リストに上位から順に表示します。

2. 環境構成

リアルタイムランキング機能を実現するには、PHPの実行環境が必要です。 PHP をサポートする任意の Web サーバーを使用して環境を構成できます。たとえば、Apache、Nginx などです。同時に、アクセス数やページ情報を保存するための MySQL データベースも必要です。

3. 実装手順

1. データベースの作成

最初にデータベースを作成し、ページ情報とアクセス数を保存するためのテーブルを追加する必要があります。次の SQL ステートメントを使用してサンプル データベースを作成できます。

CREATE DATABASE counter;

USE counter;

CREATE TABLE pages (
    id INT(11) NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE visits (
    id INT(11) NOT NULL AUTO_INCREMENT,
    page_id INT(11) NOT NULL,
    count INT(11) NOT NULL DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    FOREIGN KEY (page_id) REFERENCES pages(id) ON DELETE CASCADE ON UPDATE CASCADE
);
ログイン後にコピー

上記のコードは、「pages」と「visits」という 2 つのテーブルを含む「counter」という名前のデータベースを作成します。

このうち、「pages」テーブルは各ページの一意の ID や名前などのページ情報を保存するために使用され、

「visits」テーブルはページの訪問数を保存するために使用されます。各ページ (各ページを含む) 一意の ID、ページ ID、訪問回数および訪問時間。

2. PHP コードを作成します

次に、リアルタイム ランキング機能を完成させるための PHP コードを作成します。 PDO を使用してデータベースにアクセスします。

//データベース構成の定義
$host = 'localhost';
$dbname = 'counter';
$user = 'root' ;
$pass = '';

//データベース接続の作成
try {

$dbh = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
ログイン後にコピー

} catch (PDOException $e) {

echo "Error!: " . $e->getMessage() . "<br/>";
die();</p>
<p>}</p>
<p>//ページ ID と名前を取得します<br>$pageId = $_GET['page_id'];<br>$pageName = $_GET['page_name'];</p>
<p>//によるとページへ 名前クエリ ページ ID<br>$stmt = $dbh->prepare("SELECT id FROM pages WHERE name = ?");<br>$stmt->execute(array($pageName));<br>$ row = $stmt->fetch(PDO::FETCH_ASSOC);<br>if ($row) {</p>
<pre class="brush:php;toolbar:false">//页面存在,获取页面ID
$pageId = $row['id'];
ログイン後にコピー

} else {

//页面不存在,插入新记录并获取新的页面ID
$stmt = $dbh->prepare("INSERT INTO pages (name) VALUES (?)");
$stmt->execute(array($pageName));
$pageId = $dbh->lastInsertId();
ログイン後にコピー

}

// 訪問数を更新
$stmt = $dbh->prepare("INSERT INTO visit (page_id) VALUES (?) ON DUPLICATE KEY UPDATE count = count 1");
$stmt->execute (array( $pageId));

//リアルタイム リストを取得します
$limit = 10; //上位 10 を取得します
$stmt = $dbh->prepare(" SELECT Pages.name, SUM(visits.count) AS count FROM Pages JOIN 訪問数 ON Pages.id = Visits.page_id GROUP BY Pages.name ORDER BY count DESC LIMIT {$limit}");
$stmt-> execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

//リアルタイム リストを出力します
foreach ($rows as $row) {

echo "{$row['name']}: {$row['count']}<br>";
ログイン後にコピー

}

?>

上記の PHP コードは、次の操作を実装します:

1) 入力ページ名をクエリし、それに基づいてページ ID をクエリします。名前。ページが存在しない場合は、新しいレコードを挿入し、新しいページ ID を取得します。

2) アクセス数を更新します。レコードがすでに存在する場合はカウント値が更新され、レコードが存在しない場合は新しいレコードが挿入されます。

3) アクセス数テーブルとページテーブルに従って、すべてのページのアクセス数をクエリし、カウント値に従って高い順に並べ替えます。

4) 最初の 10 ページと対応するアクセス数を出力します。

4. パフォーマンスの最適化

上記のコードは基本的なリアルタイム ランキング機能を実装していますが、高負荷条件下ではパフォーマンスの問題に直面する可能性があります。パフォーマンスを向上させるために使用できる最適化のヒントをいくつか紹介します。

1) キャッシュを使用する

キャッシュを使用してクエリを最適化できます。たとえば、Redis や Memcached などのキャッシュ サービスを使用して、クエリ結果をメモリにキャッシュできます。

2) スケジュールされたタスクを使用する

スケジュールされたタスクを使用すると、訪問ごとに動的にランキングを生成するのではなく、一定の間隔でリアルタイムのランキングを生成できます。たとえば、リアルタイムのランキングを分または時間ごとに生成でき、結果をキャッシュし、アクセス時にキャッシュから直接取得できます。

3) SQL クエリの最適化

インデックスの使用、サブクエリの使用の回避、接続プールの使用など、SQL クエリ ステートメントを最適化できます。さらに、データベース シャーディングとテーブル シャーディングを使用してデータを複数のテーブルに分散し、単一テーブル内のデータが多すぎることによって発生するパフォーマンスの問題を回避することもできます。

つまり、リアルタイム リストは重要な機能ですが、実装時にはパフォーマンスの問題を考慮する必要があり、実際の状況に応じて技術的な解決策を柔軟に選択する必要があります。

以上がPHPで簡単なリアルタイムランキング機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート