Maison > développement back-end > tutoriel php > Comment mettre en œuvre un système de questions et réponses en ligne en temps réel via PHP et WebSocket

Comment mettre en œuvre un système de questions et réponses en ligne en temps réel via PHP et WebSocket

王林
Libérer: 2023-12-17 13:48:01
original
1406 Les gens l'ont consulté

Comment mettre en œuvre un système de questions et réponses en ligne en temps réel via PHP et WebSocket

Avec le développement d'Internet, le système interactif de questions et réponses en ligne en temps réel est progressivement devenu une application réseau courante. Il peut non seulement répondre aux besoins des utilisateurs en matière de communication en temps réel, mais également améliorer la fidélité et la participation des utilisateurs. Dans cet article, nous utiliserons PHP et WebSocket comme base pour présenter comment implémenter un système de questions et réponses en ligne en temps réel, et fournirons des exemples de code spécifiques afin que les lecteurs puissent mieux comprendre et apprendre.

1. Qu'est-ce que WebSocket

WebSocket est une norme de communication bidirectionnelle basée sur le protocole TCP. Il peut établir une connexion en temps réel entre le navigateur Web et le serveur Web pour réaliser une transmission de données en temps réel. Grâce à WebSocket, nous pouvons transmettre les données des applications Web au client en temps réel, ou recevoir des demandes et des réponses en temps réel du client.

2. Pourquoi utiliser WebSocket pour implémenter un système de questions et réponses en ligne en temps réel ?

La méthode d'interrogation Ajax traditionnelle présente certains problèmes en termes de performances et de stabilité, tels que l'augmentation de la pression du serveur et du retard du réseau. L'utilisation de WebSocket peut optimiser efficacement ces questions et rendre le système de questions et réponses plus fluide et plus stable.

3. Comment utiliser PHP et WebSocket pour implémenter un système de questions et réponses en ligne en temps réel

  1. Installer WebSocket

Nous pouvons utiliser la bibliothèque de classes PHP WebSocket pour implémenter WebSocket. Dans cet article, nous utilisons le serveur PHP WAMP (https://wampserver.com/) pour configurer un environnement de développement et installer la bibliothèque de classes PHP WebSocket (https://github.com/Textalk/websocket-php).

  1. Créer un serveur WebSocket

Ensuite, nous devons créer un serveur WebSocket pour gérer les demandes des clients. Le serveur WebSocket doit écouter le port spécifié et attendre que le client se connecte. Lorsqu'un client se connecte avec succès, le serveur crée un objet WebSocket et interagira avec le client.

Voici un exemple simple de serveur 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();
Copier après la connexion

Ce code crée une instance de serveur WebSocket écoutant sur le port 127.0.0.1:8080. Lorsqu'un client se connecte avec succès, le serveur affichera l'ID de connexion via la fonction de rappel et le diffusera à tous les clients connectés lors de la réception du message client.

  1. Créer un système de questions et réponses

Ensuite, nous devons créer un système de questions et réponses pour gérer les questions et réponses des utilisateurs. Nous pouvons implémenter ce système en utilisant PHP et MySQL.

Tout d'abord, nous devons créer une base de données pour stocker les questions et réponses posées par les utilisateurs. Voici un exemple d'instruction SQL pour créer une table de données :

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
);
Copier après la connexion

Ce code crée deux tables de données pour stocker les détails des questions et des réponses. Parmi eux, question_id est l'identifiant de la réponse à la question.

Ensuite, nous implémentons une page de traitement des questions permettant aux utilisateurs de poser des questions et d'afficher les questions et réponses existantes dans un navigateur Web. Lorsqu'un utilisateur soumet une question, nous transmettons les informations de la question à tous les clients connectés via WebSocket. Lorsque le client reçoit une nouvelle question, elle sera affichée sur la page.

Ce qui suit est un exemple de code simple :

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 } ?>
Copier après la connexion

Ce code implémente le traitement des questions initiées par l'utilisateur et, lorsqu'il transmet de nouvelles questions au client, il transmet les données JSON via WebSocket afin que le client puisse gérer correctement les nouvelles questions.

Ensuite, nous implémentons une page de traitement des réponses. Lorsque l'utilisateur soumet une réponse, la réponse sera enregistrée dans la base de données MySQL et les informations de réponse seront transmises à tous les clients connectés via WebSocket. Lorsque le client reçoit une nouvelle réponse, elle sera affichée sur la page.

Ce qui suit est un exemple de code simple :

// 处理用户提交回答
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>
Copier après la connexion

Ce code implémente le traitement des réponses des utilisateurs aux questions, et lors de l'envoi de nouvelles réponses au client, il transmet les données JSON via WebSocket afin que le client puisse traiter correctement les nouvelles réponses.

4. Résumé

Cet article présente comment utiliser PHP et WebSocket pour implémenter un système de questions et réponses en ligne en temps réel et fournit des exemples de code spécifiques. Grâce à WebSocket, nous pouvons optimiser efficacement les performances et la stabilité du système de questions-réponses, rendant ainsi l'utilisation du système plus agréable pour les utilisateurs. Dans le même temps, les lecteurs peuvent également optimiser leurs propres applications Web sur la base de ces exemples de codes et offrir une meilleure expérience utilisateur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal