Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiele für die PHP-WebSocket-Entwicklung: praktische Beispiele für die Implementierung bestimmter Funktionen

Beispiele für die PHP-WebSocket-Entwicklung: praktische Beispiele für die Implementierung bestimmter Funktionen

WBOY
WBOYOriginal
2023-09-12 13:27:271353Durchsuche

PHP WebSocket开发实例:如何实现特定功能的实践案例

PHP WebSocket-Entwicklungsbeispiele: praktische Beispiele für die Implementierung spezifischer Funktionen

In den letzten Jahren hat das traditionelle HTTP-Protokoll mit zunehmender Komplexität von Webanwendungen einige Mängel bei der Echtzeitkommunikation gezeigt. Um den Anforderungen der Echtzeitkommunikation gerecht zu werden, wurde WebSocket ins Leben gerufen.

WebSocket ist ein Protokoll für die Vollduplex-Kommunikation über eine einzelne TCP-Verbindung, das es dem Server ermöglicht, Daten aktiv an den Client zu übertragen, ohne dass der Client eine Anfrage sendet. Dies macht Echtzeitkommunikation, Online-Spiele, Echtzeitüberwachung und andere Anwendungen komfortabler und effizienter.

In diesem Artikel stellen wir ein Beispiel für die WebSocket-Entwicklung auf Basis von PHP vor. In diesem Fall lernen wir den praktischen Prozess zur Implementierung einer bestimmten Funktion kennen.

Angenommen, wir möchten eine Online-Chatroom-Anwendung entwickeln, auf der Benutzer Nachrichten senden und andere Benutzer diese sofort empfangen und beantworten können. Diese Funktion umfasst die folgenden Schlüsselpunkte:

  1. Aufbau eines WebSocket-Servers
  2. Kommunikation zwischen Client und Server
  3. Senden und Empfangen von Nachrichten
  4. Pflege der Benutzerliste

Zuerst müssen wir einen WebSocket-Server erstellen. In PHP können wir die Ratchet-Bibliothek verwenden, um WebSocket-Funktionen zu implementieren. Installieren Sie Ratchet über Composer:

composer require cboden/ratchet

Als nächstes erstellen Sie eine server.php-Datei und schreiben den folgenden Code:

<?php

require 'vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
use RatchetServerIoServer;
use RatchetHttpHttpServer;
use RatchetWebSocketWsServer;

class Chat implements MessageComponentInterface {
    protected $clients;
    
    public function __construct() {
        $this->clients = new SplObjectStorage;
    }
    
    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "New connection! ({$conn->resourceId})
";
    }
    
    public function onMessage(ConnectionInterface $from, $msg) {
        // 处理消息,比如将消息发送给其他在线用户
        foreach ($this->clients as $client) {
            if ($client !== $from) {
                $client->send($msg);
            }
        }
    }
    
    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "Connection {$conn->resourceId} has disconnected
";
    }
    
    public function onError(ConnectionInterface $conn, Exception $e) {
        echo "An error has occurred: {$e->getMessage()}
";
        $conn->close();
    }
}

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8080
);

$server->run();

Dieser Code erstellt eine Chat-Klasse und implementiert die MessageComponentInterface-Schnittstelle. Wir können verschiedene Ereignisbehandlungsfunktionen definieren. Als nächstes müssen wir die Nachricht an andere Online-Benutzer senden. Hier verwenden wir eine foreach-Schleife, um alle verbundenen Clients zu durchlaufen und festzustellen, ob es sich um den Quellclient selbst handelt.

Führen Sie php server.php in der Befehlszeile aus und der WebSocket-Server wird gestartet.

Als nächstes müssen wir die Kommunikation mit dem Server auf der Webseite implementieren. Auf einer Webseite können wir JavaScript verwenden, um ein WebSocket-Objekt für die Kommunikation mit dem Backend zu erstellen.

<script>
var conn = new WebSocket('ws://localhost:8080');

conn.onopen = function() {
    console.log('Connected!');
}

conn.onmessage = function(e) {
    console.log('Received: ' + e.data);
}

function sendMessage() {
    var message = document.getElementById('input').value;
    conn.send(message);
}
</script>

Der obige Code erstellt ein WebSocket-Objekt und definiert die Handlerfunktionen für die Ereignisse onopen und onmessage. Nachdem Sie die Nachricht in das Eingabefeld eingegeben haben, klicken Sie auf die Schaltfläche „Senden“, um die Funktion „sendMessage“ aufzurufen und die Nachricht an den Server zu senden.

Schließlich müssen wir eine Benutzerliste verwalten, um Online-Benutzer anzuzeigen und die Benutzerliste zu aktualisieren. Wir können den Ereignissen onOpen und onClose auf der Serverseite entsprechende Logik hinzufügen:

public function onOpen(ConnectionInterface $conn) {
    $this->clients->attach($conn);
    echo "New connection! ({$conn->resourceId})
";
    
    // 将新用户加入用户列表,并广播给其他在线用户
    foreach ($this->clients as $client) {
        $client->send('New user has joined');
    }
}

public function onClose(ConnectionInterface $conn) {
    $this->clients->detach($conn);
    echo "Connection {$conn->resourceId} has disconnected
";
    
    // 将离线用户从用户列表中删除,并广播给其他在线用户
    foreach ($this->clients as $client) {
        $client->send('A user has left');
    }
}

Wenn ein neuer Benutzer beitritt und der Benutzer offline geht, senden wir über den obigen Code entsprechende Nachrichten an andere Online-Benutzer, um die Benutzerliste zu aktualisieren.

Zusammenfassend haben wir anhand eines Beispiels eines Online-Chatrooms gelernt, wie man PHP WebSocket verwendet, um den Entwicklungsprozess bestimmter Funktionen zu implementieren. Natürlich kann WebSocket auch in einem breiteren Spektrum von Bereichen eingesetzt werden, wie z. B. Push-Benachrichtigungen, Online-Spiele, Echtzeitüberwachung usw. Ich hoffe, dass die praktischen Fälle in diesem Artikel für Ihr Lernen und Ihre Entwicklung hilfreich sein können!

Das obige ist der detaillierte Inhalt vonBeispiele für die PHP-WebSocket-Entwicklung: praktische Beispiele für die Implementierung bestimmter Funktionen. 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