Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk melaksanakan sistem soal jawab dalam talian masa nyata melalui PHP dan WebSocket

Bagaimana untuk melaksanakan sistem soal jawab dalam talian masa nyata melalui PHP dan WebSocket

王林
王林asal
2023-12-17 13:46:151439semak imbas

Bagaimana untuk melaksanakan sistem soal jawab dalam talian masa nyata melalui PHP dan WebSocket

Dengan perkembangan Internet, sistem soal jawab interaktif dalam talian masa nyata telah beransur-ansur menjadi aplikasi rangkaian biasa. Ia bukan sahaja dapat memenuhi keperluan pengguna untuk komunikasi masa nyata, tetapi juga meningkatkan kelekatan dan penyertaan pengguna. Dalam artikel ini, kami akan menggunakan PHP dan WebSocket sebagai asas untuk memperkenalkan cara melaksanakan sistem soal jawab dalam talian masa nyata, dan menyediakan contoh kod khusus supaya pembaca dapat memahami dan belajar dengan lebih baik.

1. Apakah itu WebSocket

WebSocket ialah standard komunikasi dua hala berdasarkan protokol TCP. Ia boleh mewujudkan sambungan masa nyata antara pelayar web dan pelayan web untuk merealisasikan penghantaran data masa nyata. Melalui WebSocket, kami boleh menolak data daripada aplikasi web kepada pelanggan dalam masa nyata, atau menerima permintaan dan respons masa nyata daripada pelanggan.

2. Mengapa menggunakan WebSocket untuk melaksanakan sistem soal jawab dalam talian masa nyata

Kaedah undian Ajax tradisional mempunyai beberapa masalah dalam prestasi dan kestabilan, seperti meningkatkan tekanan pelayan dan kelewatan rangkaian. Menggunakan WebSocket boleh mengoptimumkan soalan ini dengan berkesan dan menjadikan sistem soal jawab lebih lancar dan stabil.

3. Cara menggunakan PHP dan WebSocket untuk melaksanakan sistem soal jawab dalam talian masa nyata

  1. Pasang WebSocket

Kita boleh menggunakan perpustakaan kelas WebSocket PHP untuk melaksanakan WebSocket. Dalam artikel ini, kami menggunakan pelayan PHP WAMP (https://wampserver.com/) untuk menyediakan persekitaran pembangunan dan memasang perpustakaan kelas WebSocket PHP (https://github.com/Textalk/websocket-php).

  1. Buat Pelayan WebSocket

Seterusnya, kita perlu mencipta pelayan WebSocket untuk mengendalikan permintaan pelanggan. Pelayan WebSocket perlu mendengar port yang ditentukan dan menunggu klien untuk menyambung. Apabila pelanggan berjaya menyambung, pelayan akan mencipta objek WebSocket dan berinteraksi dengan klien.

Berikut ialah contoh pelayan WebSocket yang mudah:

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();

Kod ini mencipta contoh pelayan WebSocket yang mendengar pada port 127.0.0.1:8080. Apabila pelanggan berjaya menyambung, pelayan akan mengeluarkan ID sambungan melalui fungsi panggil balik dan menyiarkannya kepada semua pelanggan yang disambungkan apabila menerima mesej klien.

  1. Buat sistem soal jawab

Seterusnya, kita perlu mencipta sistem soal jawab untuk mengendalikan soalan dan jawapan pengguna. Kita boleh melaksanakan sistem ini menggunakan PHP dan MySQL.

Pertama, kita perlu mencipta pangkalan data untuk menyimpan soalan dan jawapan yang ditanya oleh pengguna. Berikut ialah contoh pernyataan SQL untuk membuat jadual data:

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
);

Kod ini mencipta dua jadual data untuk menyimpan butiran soalan dan jawapan. Antaranya, question_id ialah ID jawapan kepada soalan.

Seterusnya, kami melaksanakan halaman pemprosesan soalan untuk pengguna bertanya soalan dan melihat soalan dan jawapan sedia ada dalam pelayar web. Apabila pengguna menyerahkan soalan, kami menolak maklumat soalan kepada semua pelanggan yang disambungkan melalui WebSocket. Apabila pelanggan menerima soalan baharu, ia akan dipaparkan pada halaman.

Berikut ialah contoh kod mudah:

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

Kod ini melaksanakan pemprosesan soalan yang dimulakan pengguna, dan apabila menolak soalan baharu kepada pelanggan, ia menghantar data JSON melalui WebSocket supaya pelanggan boleh mengendalikan soalan baharu dengan betul.

Seterusnya, kami melaksanakan halaman pemprosesan jawapan Apabila pengguna menyerahkan jawapan, jawapan akan disimpan ke pangkalan data MySQL dan maklumat jawapan akan ditolak kepada semua pelanggan yang disambungkan melalui WebSocket. Apabila pelanggan menerima jawapan baharu, ia akan dipaparkan pada halaman.

Berikut ialah contoh kod mudah:

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

Kod ini melaksanakan pemprosesan jawapan pengguna kepada soalan, dan apabila menolak jawapan baharu kepada pelanggan, ia menghantar data JSON melalui WebSocket supaya pelanggan boleh memproses jawapan baharu dengan betul.

4. Ringkasan

Artikel ini memperkenalkan cara menggunakan PHP dan WebSocket untuk melaksanakan sistem soal jawab dalam talian masa nyata, dan menyediakan contoh kod khusus. Melalui WebSocket, kami boleh mengoptimumkan prestasi dan kestabilan sistem Soal Jawab dengan berkesan, menjadikannya lebih menyeronokkan untuk pengguna menggunakan sistem. Pada masa yang sama, pembaca juga boleh mengoptimumkan aplikasi web mereka sendiri berdasarkan kod sampel ini dan memberikan pengalaman pengguna yang lebih baik.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan sistem soal jawab dalam talian masa nyata melalui PHP dan WebSocket. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn