Heim > PHP-Framework > Workerman > Hauptteil

Workerman-Entwicklung: So implementieren Sie ein Online-Abstimmungssystem basierend auf dem WebSocket-Protokoll

王林
Freigeben: 2023-11-07 10:28:44
Original
607 Leute haben es durchsucht

Workerman-Entwicklung: So implementieren Sie ein Online-Abstimmungssystem basierend auf dem WebSocket-Protokoll

Im heutigen Informationszeitalter sind Online-Wahlsysteme zu einem unverzichtbaren Bestandteil von Wahlen, Umfragen und anderen Aktivitäten geworden. Im Vergleich zu herkömmlichen Abstimmungsmethoden ist das Online-Abstimmungssystem nicht nur einfach zu bedienen, sondern auch schnell und kann Funktionen wie Echtzeitstatistiken erreichen.

In diesem Artikel erfahren Sie, wie Sie mit dem Workerman-Framework von PHP ein Online-Abstimmungssystem basierend auf dem WebSocket-Protokoll erstellen. Gleichzeitig werden spezifische Codebeispiele als Referenz für die Leser bereitgestellt.

1. Was ist Workerman?

Workerman ist ein leistungsstarkes, asynchrones Open-Source-PHP-Framework. Es basiert auf ereignisgesteuerten Ideen und kann problemlos Anwendungen mit langen Verbindungen wie WebSocket, Instant Messaging und anderen Anwendungen implementieren.

Workerman unterstützt Protokolle wie TCP, UDP und HTTP und zeichnet sich durch hohe Parallelität und geringen Speicherverbrauch aus. Im Vergleich zu herkömmlichen Webanwendungen bietet Workerman eine stärkere Echtzeitleistung und Stabilität und eignet sich daher für Anwendungsszenarien wie Online-Spiele, Chatrooms, Sperrfeuer und Nachrichten-Push.

2. Erstellen Sie einen WebSocket-Server

Bevor wir beginnen, müssen wir sicherstellen, dass die PHP-Umgebung installiert und das Workerman-Framework installiert wurde. Spezifische Installationsverfahren finden Sie in der offiziellen Dokumentation.

Als nächstes müssen wir eine neue PHP-Datei erstellen, um den WebSocket-Server zu starten und die vom Client gesendeten Nachrichten abzuhören. Angenommen, wir öffnen den WebSocket-Dienst auf dem lokalen 127.0.0.1-Port 8080. Der Code lautet wie folgt: 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();
Nach dem Login kopieren

以上代码中,我们使用 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);
    }
}
Nach dem Login kopieren

以上代码中,我们使用了 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>
Nach dem Login kopieren

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

Im obigen Code verwenden wir Workermans Worker Klasse zum Öffnen eines WebSocket-Servers und Abhören des 8080-Ports von 127.0.0.1. Das Attribut count gibt die Anzahl der gestarteten Prozesse an. Wenn ein Client eine Verbindung herstellt, wird die Rückruffunktion onConnect ausgelöst. Wenn ein Client eine Nachricht sendet, wird die Rückruffunktion onMessage ausgelöst. In diesen beiden Rückruffunktionen können wir Clientverbindungen und Nachrichten verarbeiten.

3. Implementieren Sie ein Online-Abstimmungssystem

Im Abstimmungssystem müssen wir die gleichzeitige Abstimmung mehrerer Benutzer unterstützen und die Abstimmungsergebnisse in Echtzeit anzeigen. Um eine solche Funktionalität zu implementieren, müssen wir den Shared-Memory-Mechanismus von PHP und das JSON-Format verwenden, um Daten zwischen Client und Server zu übertragen. 🎜🎜Zuerst müssen wir auf der Serverseite ein assoziatives Array $votes definieren, um die Anzahl der Stimmen für jede Abstimmungsoption zu speichern. Jedes Mal, wenn wir eine Abstimmungsanfrage vom Kunden erhalten, addieren wir eins zur Anzahl der Stimmen für die entsprechende Option und die Anzahl der Stimmen für verschiedene Optionen wird in verschiedenen Array-Elementen gespeichert. 🎜rrreee🎜Im obigen Code verwenden wir das Schlüsselwort global von PHP, um jedes Mal nach der Abstimmung das Objekt $ws_worker in die Funktion broadcast einzuführen. Die Abstimmungsergebnisse werden im JSON-Format an alle angeschlossenen Clients gesendet. Im obigen Code definieren wir außerdem eine broadcast-Funktion, um Nachrichten an alle verbundenen Clients zu senden. 🎜🎜Als nächstes müssen wir die Abstimmungsfunktion auf der Clientseite implementieren. In HTML-Seiten können wir über JavaScript-Code WebSocket-Objekte für die Echtzeitkommunikation mit dem Server erstellen. 🎜rrreee🎜Im obigen Code verwenden wir die beiden Rückruffunktionen onopen und onmessage des WebSocket-Objekts, die zur Ausgabe nach dem verwendet werden Die Verbindung wird hergestellt. Nachrichten vom Server protokollieren und empfangen. Im Formular verwenden wir das Ereignis submit, um das Abstimmungsverhalten des Benutzers zu erfassen und die Abstimmungsinformationen über das Objekt WebSocket an den Server zu senden. Jedes Mal, wenn wir Abstimmungsergebnisse vom Server erhalten, aktualisieren wir die Abstimmungsdaten auf der HTML-Seite über die Funktion updateVotes. 🎜🎜IV. Zusammenfassung🎜🎜Dieser Artikel stellt vor, wie man das Workerman-Framework von PHP verwendet, um ein Online-Abstimmungssystem basierend auf dem WebSocket-Protokoll zu implementieren, und gibt spezifische Codebeispiele. Durch das Studium dieses Artikels sollten die Leser ein tieferes Verständnis und eine Beherrschung des Workerman-Frameworks, des Shared-Memory-Mechanismus, des WebSocket-Protokolls und anderer Kenntnisse erlangen. 🎜

Das obige ist der detaillierte Inhalt vonWorkerman-Entwicklung: So implementieren Sie ein Online-Abstimmungssystem basierend auf dem WebSocket-Protokoll. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!