ホームページ  >  記事  >  バックエンド開発  >  PHP と WebSocket を介してリアルタイムのオンライン質疑応答システムを実装する方法

PHP と WebSocket を介してリアルタイムのオンライン質疑応答システムを実装する方法

王林
王林オリジナル
2023-12-17 13:46:151327ブラウズ

PHP と WebSocket を介してリアルタイムのオンライン質疑応答システムを実装する方法

インターネットの発展に伴い、リアルタイムのオンライン対話型質疑応答システムは、徐々に一般的なネットワーク アプリケーションになってきました。リアルタイムのコミュニケーションに対するユーザーのニーズを満たすだけでなく、ユーザーの定着性と参加性も高めることができます。この記事では、PHP と WebSocket を基礎として使用して、リアルタイムのオンライン質疑応答システムを実装する方法を紹介し、読者がよりよく理解して学習できるように、具体的なコード例を示します。

1. WebSocket とは

WebSocket は、TCP プロトコルに基づく双方向通信標準です。 WebブラウザとWebサーバーの間にリアルタイム接続を確立し、リアルタイムのデータ送信を実現します。 WebSocket を介して、Web アプリケーションからクライアントにリアルタイムでデータをプッシュしたり、クライアントからリアルタイムのリクエストと応答を受信したりできます。

2. リアルタイムのオンライン質疑応答システムの実装に WebSocket を使用する理由

従来の Ajax ポーリング方法には、サーバーの負荷やネットワーク遅延の増加など、パフォーマンスと安定性にいくつかの問題があります。 WebSocket を使用すると、これらの質問を効果的に最適化し、質問と回答のシステムをよりスムーズかつ安定させることができます。

3. PHP と WebSocket を使用してリアルタイムのオンライン質疑応答システムを実装する方法

  1. WebSocket のインストール

PHP を使用できます。 WebSocketを実装するためのWebSocketクラスライブラリ。この記事では、PHP WAMP サーバー (https://wampserver.com/) を使用して開発環境をセットアップし、PHP WebSocket クラス ライブラリ (https://github.com/Textalk/websocket-php) をインストールします。

  1. WebSocket サーバーの作成

次に、クライアントのリクエストを処理する WebSocket サーバーを作成する必要があります。 WebSocket サーバーは、指定されたポートをリッスンし、クライアントが接続するのを待つ必要があります。クライアントが正常に接続すると、サーバーは WebSocket オブジェクトを作成し、クライアントと対話します。

以下は簡単な WebSocket サーバーの例です:

use WebSocketServer;

$server = new Server('127.0.0.1', 8080);

$server->on('open', function($conn) {
    echo "New connection added: {$conn->getId()}
";
});

$server->on('message', function($conn, $msg) use ($server) {
    $server->broadcast($msg);
});

$server->run();

このコードは WebSocket サーバー インスタンスを作成し、ポート 127.0.0.1:8080 をリッスンします。クライアントが正常に接続すると、サーバーはコールバック関数を通じて接続 ID を出力し、クライアント メッセージの受信時に接続されているすべてのクライアントにブロードキャストします。

  1. 質問と回答システムの作成

次に、ユーザーの質問と回答を処理するための質問と回答システムを作成する必要があります。このシステムは、PHP と MySQL を使用して実装できます。

まず、ユーザーからの質問と回答を保存するデータベースを作成する必要があります。以下は、データ テーブルを作成するサンプル SQL ステートメントです。

CREATE TABLE `questions_info` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `content` text NOT NULL,
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE `answers_info` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `question_id` int(11) NOT NULL,
  `content` text NOT NULL,
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
);

このコードは、質問と回答に関する詳細情報を保存する 2 つのデータ テーブルを作成します。このうち、question_idは質問に対する回答のIDです。

次に、ユーザーが質問したり、Web ブラウザーで既存の質問と回答を表示したりできるように、質問処理ページを実装します。ユーザーが質問を送信すると、WebSocket 経由で接続されているすべてのクライアントに質問情報がプッシュされます。クライアントが新しい質問を受け取ると、その質問がページに表示されます。

以下は簡単なサンプル コードです:

use WebSocketClient;

// 引入数据库连接信息
require_once 'config.php';

// 创建MySQL连接对象
$mysqli = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);

// 处理用户提交问题
if (isset($_POST['submit'])) {
    $title = $mysqli->real_escape_string($_POST['title']);
    $content = $mysqli->real_escape_string($_POST['content']);
    $query = "INSERT INTO questions_info (title, content) VALUES ('$title', '$content')";
    $mysqli->query($query);
    $id = $mysqli->insert_id;

    // 推送新问题到客户端
    $client = new Client('ws://127.0.0.1:8080');
    $client->send('{"type":"new_question","id":'.$id.',"title":"'.$title.'","content":"'.$content.'"}');
}

// 查询已有问题
$query = "SELECT * FROM questions_info ORDER BY create_time DESC";
$result = $mysqli->query($query);

// 输出问题列表
while ($row = $result->fetch_assoc()) {
    $question_id = $row['id'];
    $question_title = $row['title'];
    $question_content = $row['content'];

    // 查询问题回答数
    $query = "SELECT COUNT(*) FROM answers_info WHERE question_id=$question_id";
    $answer_count = $mysqli->query($query)->fetch_row()[0];
?>

<div class="question-item">
    <h3 class="question-title">
        <a href="question.php?id=<?php echo $question_id; ?>"><?php echo $question_title; ?></a>
    </h3>
    <div class="question-content"><?php echo $question_content; ?></div>
    <div class="question-meta">
        <span class="answer-count"><?php echo $answer_count; ?>回答</span>
    </div>
</div>

<?php } ?>

このコードはユーザーが開始した質問の処理を実装し、新しい質問をクライアントにプッシュするときに WebSocket 経由で JSON データを渡します。クライアントは新しい問題を正しく処理できます。

次に、回答処理ページを実装します。ユーザーが回答を送信すると、回答は MySQL データベースに保存され、回答情報は WebSocket を通じて接続されているすべてのクライアントにプッシュされます。クライアントが新しい回答を受け取ると、ページに表示されます。

以下は簡単なサンプル コードです:

// 处理用户提交回答
if (isset($_POST['submit'])) {
    $question_id = $_POST['question_id'];
    $content = $mysqli->real_escape_string($_POST['content']);
    $query = "INSERT INTO answers_info (question_id, content) VALUES ('$question_id', '$content')";
    $mysqli->query($query);
    $id = $mysqli->insert_id;

    // 推送新回答到客户端
    $client = new Client('ws://127.0.0.1:8080');
    $client->send('{"type":"new_answer","id":'.$id.',"question_id":'.$question_id.',"content":"'.$content.'"}');
}

// 查询问题和回答列表
$question_id = $_GET['id'];
$query = "SELECT * FROM questions_info WHERE id=$question_id";
$question = $mysqli->query($query)->fetch_assoc();
$query = "SELECT * FROM answers_info WHERE question_id=$question_id ORDER BY create_time DESC";
$result = $mysqli->query($query);
?>

<h2 class="question-title"><?php echo $question['title']; ?></h2>
<div class="question-content"><?php echo $question['content']; ?></div>

<!-- 输出回答列表 -->
<?php while ($row = $result->fetch_assoc()) { ?>
<div class="answer-item">
    <div class="answer-content"><?php echo $row['content']; ?></div>
</div>
<?php } ?>

<!-- 输出回答表单 -->
<form method="post">
    <input type="hidden" name="question_id" value="<?php echo $question_id; ?>">
    <div class="form-item">
        <textarea name="content"></textarea>
    </div>
    <div class="form-item">
        <input type="submit" name="submit" value="提交回答">
    </div>
</form>

このコードは、質問に対するユーザーの回答の処理を実装し、新しい回答をクライアントにプッシュするときに、WebSocket 経由で JSON データを渡します。クライアントは新しい応答を正しく処理できます。

4. 概要

この記事では、PHP と WebSocket を使用してリアルタイムのオンライン質疑応答システムを実装する方法を紹介し、具体的なコード例を示します。 WebSocket を通じて、Q&A システムのパフォーマンスと安定性を効果的に最適化し、ユーザーがシステムをより楽しく使用できるようにします。同時に、読者はこれらのサンプル コードに基づいて独自の Web アプリケーションを最適化し、より良いユーザー エクスペリエンスを提供することもできます。

以上がPHP と WebSocket を介してリアルタイムのオンライン質疑応答システムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。