Heim >Backend-Entwicklung >PHP-Tutorial >So implementieren Sie ein Echtzeit-Online-Frage- und Antwortsystem über PHP und WebSocket

So implementieren Sie ein Echtzeit-Online-Frage- und Antwortsystem über PHP und WebSocket

王林
王林Original
2023-12-17 13:46:151434Durchsuche

So implementieren Sie ein Echtzeit-Online-Frage- und Antwortsystem über PHP und WebSocket

Mit der Entwicklung des Internets ist das interaktive Online-Frage- und Antwortsystem in Echtzeit nach und nach zu einer gängigen Netzwerkanwendung geworden. Es kann nicht nur die Bedürfnisse der Benutzer nach Echtzeitkommunikation erfüllen, sondern auch die Bindung und Beteiligung der Benutzer verbessern. In diesem Artikel werden wir PHP und WebSocket als Grundlage verwenden, um die Implementierung eines Echtzeit-Online-Frage- und Antwortsystems vorzustellen und spezifische Codebeispiele bereitzustellen, damit die Leser es besser verstehen und lernen können.

1. Was ist WebSocket? WebSocket ist ein bidirektionaler Kommunikationsstandard, der auf dem TCP-Protokoll basiert. Es kann eine Echtzeitverbindung zwischen dem Webbrowser und dem Webserver herstellen, um eine Echtzeit-Datenübertragung zu realisieren. Über WebSocket können wir Daten von Webanwendungen in Echtzeit an den Client übertragen oder Echtzeitanforderungen und -antworten vom Client empfangen.

2. Warum WebSocket verwenden, um ein Echtzeit-Online-Frage- und Antwortsystem zu implementieren?

Die herkömmliche Ajax-Abfragemethode weist einige Probleme hinsichtlich Leistung und Stabilität auf, z. B. zunehmenden Serverdruck und Netzwerkverzögerung. Die Verwendung von WebSocket kann diese Fragen effektiv optimieren und das Frage- und Antwortsystem reibungsloser und stabiler machen.

3. So verwenden Sie PHP und WebSocket, um ein Echtzeit-Online-Frage- und Antwortsystem zu implementieren.

WebSocket installieren. Wir können die PHP-WebSocket-Klassenbibliothek verwenden, um WebSocket zu implementieren. In diesem Artikel verwenden wir den PHP-WAMP-Server (https://wampserver.com/), um eine Entwicklungsumgebung einzurichten und die PHP-WebSocket-Klassenbibliothek (https://github.com/Textalk/websocket-php) zu installieren.
  1. WebSocket-Server erstellen

Als nächstes müssen wir einen WebSocket-Server erstellen, um Client-Anfragen zu verarbeiten. Der WebSocket-Server muss den angegebenen Port abhören und darauf warten, dass der Client eine Verbindung herstellt. Wenn ein Client erfolgreich eine Verbindung herstellt, erstellt der Server ein WebSocket-Objekt und interagiert mit dem Client.
  1. Hier ist ein einfaches Beispiel für einen WebSocket-Server:
  2. 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();
Dieser Code erstellt eine WebSocket-Serverinstanz, die Port 127.0.0.1:8080 überwacht. Wenn ein Client erfolgreich eine Verbindung herstellt, gibt der Server die Verbindungs-ID über die Rückruffunktion aus und sendet sie beim Empfang der Client-Nachricht an alle verbundenen Clients.

Erstellen Sie ein Frage- und Antwortsystem.

Als Nächstes müssen wir ein Frage- und Antwortsystem erstellen, um Benutzerfragen und -antworten zu verarbeiten. Wir können dieses System mit PHP und MySQL implementieren.
  1. Zuerst müssen wir eine Datenbank erstellen, um die von Benutzern gestellten Fragen und Antworten zu speichern. Das Folgende ist eine Beispiel-SQL-Anweisung zum Erstellen einer Datentabelle:
  2. 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
    );
Dieser Code erstellt zwei Datentabellen, um die Details der Fragen und Antworten zu speichern. Unter diesen ist questions_id die ID der Antwort auf die Frage.

Als nächstes implementieren wir eine Frageverarbeitungsseite, auf der Benutzer Fragen stellen und vorhandene Fragen und Antworten in einem Webbrowser anzeigen können. Wenn ein Benutzer eine Frage sendet, übertragen wir die Frageninformationen über WebSocket an alle verbundenen Clients. Wenn der Kunde eine neue Frage erhält, wird diese auf der Seite angezeigt.

Das Folgende ist ein einfacher Beispielcode:

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 } ?>

Dieser Code implementiert die Verarbeitung von vom Benutzer initiierten Fragen und leitet beim Pushen neuer Fragen an den Client JSON-Daten über WebSocket weiter, damit der Client die neuen Fragen korrekt bearbeiten kann.

Als nächstes implementieren wir eine Antwortverarbeitungsseite. Wenn der Benutzer eine Antwort sendet, wird die Antwort in der MySQL-Datenbank gespeichert und die Antwortinformationen werden über WebSocket an alle verbundenen Clients gesendet. Wenn der Kunde eine neue Antwort erhält, wird diese auf der Seite angezeigt.

Das Folgende ist ein einfacher Beispielcode:

// 处理用户提交回答
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>

Dieser Code implementiert die Verarbeitung von Benutzerantworten auf Fragen und leitet beim Pushen neuer Antworten an den Client JSON-Daten über WebSocket weiter, damit der Client die neuen Antworten korrekt verarbeiten kann.

4. Zusammenfassung

Dieser Artikel stellt die Verwendung von PHP und WebSocket zur Implementierung eines Echtzeit-Online-Frage- und Antwortsystems vor und bietet spezifische Codebeispiele. Durch WebSocket können wir die Leistung und Stabilität des Q&A-Systems effektiv optimieren und so die Nutzung des Systems für Benutzer angenehmer gestalten. Gleichzeitig können Leser anhand dieser Beispielcodes auch ihre eigenen Webanwendungen optimieren und für ein besseres Benutzererlebnis sorgen.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie ein Echtzeit-Online-Frage- und Antwortsystem über PHP und WebSocket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn