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.1
的 8080
端口开启 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.1
的 8080
端口。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
对象的 onopen
、onmessage
两个回调函数,分别用于在连接建立后输出日志和接收来自服务器的消息。在表单中,我们使用 submit
事件来捕获用户投票的行为,并通过 WebSocket
对象将投票信息发送到服务器。在每次接收到服务器发送的投票结果时,我们会通过 updateVotes
rrreee
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!