Rumah  >  Artikel  >  rangka kerja php  >  Pembangunan pekerja: Bagaimana untuk melaksanakan sistem pengundian dalam talian berdasarkan protokol WebSocket

Pembangunan pekerja: Bagaimana untuk melaksanakan sistem pengundian dalam talian berdasarkan protokol WebSocket

王林
王林asal
2023-11-07 10:28:44640semak imbas

Pembangunan pekerja: Bagaimana untuk melaksanakan sistem pengundian dalam talian berdasarkan protokol WebSocket

Dalam era maklumat hari ini, sistem pengundian dalam talian telah menjadi bahagian penting dalam pilihan raya, tinjauan dan aktiviti lain. Berbanding kaedah pengundian tradisional, sistem pengundian dalam talian bukan sahaja mudah dikendalikan, tetapi juga pantas dan boleh merealisasikan fungsi seperti statistik masa nyata.

Artikel ini akan memperkenalkan cara menggunakan rangka kerja Workerman PHP untuk membina sistem pengundian dalam talian berdasarkan protokol WebSocket. Pada masa yang sama, contoh kod khusus akan diberikan untuk rujukan pembaca.

1. Apakah Pekerja?

Workerman ialah rangka kerja tak segerak PHP sumber terbuka berprestasi tinggi Ia berdasarkan idea dipacu peristiwa dan boleh melaksanakan aplikasi sambungan panjang dengan mudah, seperti WebSocket, pemesejan segera dan aplikasi lain.

Workerman menyokong protokol seperti TCP, UDP dan HTTP, dan mempunyai ciri konkurensi tinggi dan penggunaan memori yang rendah. Berbanding dengan aplikasi web tradisional, Workerman mempunyai prestasi masa nyata dan kestabilan yang lebih kukuh, jadi ia sesuai untuk senario aplikasi seperti permainan dalam talian, bilik sembang, rentak dan tolak mesej.

2. Bina pelayan WebSocket

Sebelum kita mula, kita perlu memastikan bahawa persekitaran PHP telah dipasang dan rangka kerja Workerman telah dipasang. Untuk prosedur pemasangan tertentu, sila rujuk kepada dokumentasi rasmi.

Seterusnya, kita perlu mencipta fail PHP baharu untuk memulakan pelayan WebSocket dan mendengar mesej yang dihantar oleh pelanggan. Katakan kita membuka perkhidmatan WebSocket pada port 8080 dari 127.0.0.1 setempat Kodnya adalah seperti berikut: 127.0.0.18080 端口开启 WebSocket 服务,代码如下:

<?php
require_once __DIR__ . '/vendor/autoload.php';

use WorkermanWorker;
use WorkermanWebServer;
use WorkermanProtocolsWebsocket;

$ws_worker = new Worker('websocket://127.0.0.1:8080');
$ws_worker->count = 1;

$ws_worker->onWorkerStart = function() {
    echo "WebSocket server started
";
};

$ws_worker->onConnect = function($connection) {
    echo "New connection established: {$connection->id}
";
};

$ws_worker->onMessage = function($connection, $data) {
    echo "Received a message from {$connection->id}: $data
";
};

Worker::runAll();

以上代码中,我们使用 Workerman 的 Worker 类来开启一个 WebSocket 服务器,并监听 127.0.0.18080 端口。count 属性指定了开启的进程数。当有客户端连接时,onConnect 回调函数将会被触发;当有客户端发送消息时,onMessage 回调函数将被触发。我们可以在这两个回调函数中处理客户端的连接和消息。

三、实现在线投票系统

在投票系统中,我们需要支持多个用户同时进行投票,并且需要实时地显示投票结果。为了实现这样的功能,我们需要使用 PHP 的共享内存机制,以及在客户端和服务器之间传递数据的 JSON 格式。

首先,我们需要在服务器端定义一个关联数组 $votes,用于存储每个投票选项的得票数。在每次接收到客户端的投票请求时,我们会将对应的选项得票数加一,而不同选项的得票数则保存在不同的数组元素中。

<?php
// ...

$votes = [
    'Option 1' => 0,
    'Option 2' => 0,
    'Option 3' => 0,
];

$ws_worker->onMessage = function($connection, $data) use ($votes) {
    $data = json_decode($data, true);
    if (!isset($data['option']) || !isset($votes[$data['option']])) {
        // 投票选项不存在或者为空
        $connection->send(json_encode([
            'code' => 400,
            'message' => 'Invalid option'
        ]));
        return;
    }
    $votes[$data['option']]++;

    // 广播投票结果
    broadcast(json_encode([
        'code' => 200,
        'message' => 'Vote successfully',
        'data' => $votes
    ]));
};

function broadcast($data) {
    global $ws_worker;
    foreach ($ws_worker->connections as $connection) {
        $connection->send($data);
    }
}

以上代码中,我们使用了 PHP 的 global 关键字,将 $ws_worker 对象引入到 broadcast 函数中,在每次投票后将投票结果以 JSON 格式广播给所有连接的客户端。在上面的代码中,我们还定义了一个 broadcast 函数,用于将消息发送给所有已连接的客户端。

接下来,我们需要实现客户端的投票功能。在 HTML 页面中,我们可以通过 JavaScript 代码创建 WebSocket 对象,用于与服务器进行实时通信。

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket - Online Voting System</title>
</head>
<body>
    <h1>Online Voting System</h1>
    <p>Vote for your favorite option:</p>
    <form id="form">
        <input type="radio" name="option" value="Option 1">Option 1<br>
        <input type="radio" name="option" value="Option 2">Option 2<br>
        <input type="radio" name="option" value="Option 3">Option 3<br>
        <input type="submit" value="Vote">
    </form>

    <ul id="result">
        <li>Option 1: <span id="vote1"></span></li>
        <li>Option 2: <span id="vote2"></span></li>
        <li>Option 3: <span id="vote3"></span></li>
    </ul>

    <script type="text/javascript">
        var ws = new WebSocket('ws://127.0.0.1:8080');

        ws.onopen = function() {
            console.log('WebSocket connected');
        }

        ws.onmessage = function(event) {
            var data = JSON.parse(event.data);
            if (data.code === 200) {
                // 投票成功
                updateVotes(data.data);
            } else {
                // 投票失败
                console.error(data.message);
            }
        }

        function updateVotes(votes) {
            document.querySelector('#vote1').innerHTML = votes['Option 1'];
            document.querySelector('#vote2').innerHTML = votes['Option 2'];
            document.querySelector('#vote3').innerHTML = votes['Option 3'];
        }

        var form = document.querySelector('#form');
        form.addEventListener('submit', function(event) {
            event.preventDefault();
            var option = document.querySelector('input[name="option"]:checked');
            if (!option) {
                console.error('Please choose an option');
                return;
            }
            var data = {
                option: option.value
            };
            ws.send(JSON.stringify(data));
            option.checked = false;
        });
    </script>
</body>
</html>

以上代码中,我们使用了 WebSocket 对象的 onopenonmessage 两个回调函数,分别用于在连接建立后输出日志和接收来自服务器的消息。在表单中,我们使用 submit 事件来捕获用户投票的行为,并通过 WebSocket 对象将投票信息发送到服务器。在每次接收到服务器发送的投票结果时,我们会通过 updateVotesrrreee

Dalam kod di atas. , kami menggunakan kelas Worker Workerman untuk membuka pelayan WebSocket dan mendengar port 8080 127.0.0.1. Atribut count menentukan bilangan proses yang dimulakan. Apabila pelanggan menyambung, fungsi panggil balik onConnect akan dicetuskan apabila pelanggan menghantar mesej, fungsi panggil balik onMessage akan dicetuskan. Kami boleh mengendalikan sambungan dan mesej pelanggan dalam dua fungsi panggil balik ini.

3. Laksanakan sistem pengundian dalam talian

Dalam sistem pengundian, kita perlu menyokong berbilang pengguna untuk mengundi pada masa yang sama, dan perlu memaparkan keputusan pengundian dalam masa nyata . Untuk melaksanakan fungsi tersebut, kita perlu menggunakan mekanisme memori kongsi PHP dan format JSON untuk menghantar data antara klien dan pelayan. #🎜🎜##🎜🎜#Pertama, kita perlu mentakrifkan tatasusunan bersekutu $votes di sebelah pelayan untuk menyimpan bilangan undian bagi setiap pilihan pengundian. Setiap kali kami menerima permintaan undian daripada pelanggan, kami akan menambah satu pada bilangan undian untuk pilihan yang sepadan dan bilangan undian untuk pilihan yang berbeza akan disimpan dalam elemen tatasusunan yang berbeza. #🎜🎜#rrreee#🎜🎜#Dalam kod di atas, kami menggunakan kata kunci global PHP untuk memperkenalkan objek $ws_worker ke dalam broadcast Dalam fungsi, keputusan pengundian disiarkan kepada semua pelanggan yang disambungkan dalam format JSON selepas setiap undian. Dalam kod di atas, kami juga mentakrifkan fungsi broadcast untuk menghantar mesej kepada semua pelanggan yang disambungkan. #🎜🎜##🎜🎜#Seterusnya, kita perlu melaksanakan fungsi pengundian di pihak pelanggan. Dalam halaman HTML, kita boleh mencipta objek WebSocket melalui kod JavaScript untuk komunikasi masa nyata dengan pelayan. #🎜🎜#rrreee#🎜🎜#Dalam kod di atas, kami menggunakan dua fungsi panggil balik objek WebSocket onopen dan onmessage untuk mengeluarkan log dan menerima mesej daripada pelayan selepas sambungan diwujudkan. Dalam borang, kami menggunakan acara serahkan untuk menangkap gelagat pengundian pengguna dan menghantar maklumat undian ke pelayan melalui objek WebSocket. Setiap kali kami menerima keputusan undian daripada pelayan, kami mengemas kini data undian dalam halaman HTML melalui fungsi updateVotes. #🎜🎜##🎜🎜# 4. Ringkasan #🎜🎜##🎜🎜# Artikel ini memperkenalkan cara menggunakan rangka kerja Workerman PHP untuk melaksanakan sistem pengundian dalam talian berdasarkan protokol WebSocket dan memberikan contoh kod khusus. Melalui mengkaji artikel ini, pembaca harus mempunyai pemahaman dan penguasaan yang lebih mendalam tentang rangka kerja Workerman, mekanisme memori yang dikongsi, protokol WebSocket dan pengetahuan lain. #🎜🎜#

Atas ialah kandungan terperinci Pembangunan pekerja: Bagaimana untuk melaksanakan sistem pengundian dalam talian berdasarkan protokol 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