So verwenden Sie Workerman zur Implementierung eines WebSocket-Servers
Mit der zunehmenden Beliebtheit der WebRTC-Technologie, Echtzeitkommunikation von Spielen, Online-Chat und anderen Anwendungen wird die WebSocket-Technologie immer wichtiger. Workerman ist ein leistungsstarkes asynchrones TCP-, UDP- und Unix-Socket-Netzwerk-Framework, das in einer PHP-Umgebung ausgeführt wird. Es unterstützt von Natur aus eine hohe Parallelität und eignet sich sehr gut für die Entwicklung von WebSocket-Servern.
In diesem Artikel wird detailliert beschrieben, wie Sie mit Workerman einen WebSocket-Server implementieren, einschließlich der Handhabung von WebSocket-Verbindungen, des Sendens und Empfangens von WebSocket-Nachrichten und der Integration des Frameworks in andere Bibliotheken. Am Ende des Artikels finden Sie außerdem einen vollständigen Beispielcode.
Bevor Sie Workerman verwenden, müssen Sie es zuerst installieren. Es kann über Composer installiert werden, oder Sie können den Quellcode direkt von GitHub herunterladen und manuell installieren. Hier nehmen wir die Composer-Installation als Beispiel:
composer require workerman/workerman
Bevor Sie Workerman zum Implementieren des WebSocket-Servers verwenden, müssen Sie zunächst verstehen, wie das WebSocket-Protokoll funktioniert. WebSocket ist ein Vollduplex-Protokoll für lange Verbindungen. Der Client und der Server stellen durch einen Handshake eine Verbindung her und können sich dann gegenseitig Nachrichten senden. WebSocket-Nachrichten können beliebige Daten wie Text, Binärdaten oder sogar Dateien sein und der Server kann sie je nach Nachrichtentyp unterschiedlich verarbeiten.
Die Implementierung eines WebSocket-Servers mit Workerman ist sehr einfach und erfordert nur wenige Codezeilen. Hier ist ein Beispiel:
require_once __DIR__ . '/vendor/autoload.php'; use WorkermanWorker; // 创建一个Worker监听8090端口,使用websocket协议通讯 $wsWorker = new Worker("websocket://0.0.0.0:8090"); // 启动4个进程对外提供服务 $wsWorker->count = 4; // 处理WebSocket连接的回调函数 $wsWorker->onConnect = function($connection) { echo "New connection "; }; // 处理WebSocket消息的回调函数 $wsWorker->onMessage = function($connection, $data) { // 处理消息... }; // 启动Worker Worker::runAll();
Zuerst erstellen wir eine Worker-Instanz und geben sie an, um Port 8090 abzuhören und über das Websocket-Protokoll zu kommunizieren. Richten Sie dann vier Prozesse ein, um eine große Anzahl gleichzeitiger Verbindungen zu verarbeiten. Worker unterstützt mehrere Übertragungsprotokolle wie TCP, UDP und Unix Socket, daher müssen wir das WebSocket-Protokoll angeben.
In diesem Beispiel definieren wir nur zwei Rückruffunktionen:
Über die onMessage-Rückruffunktion können wir die vom Client gesendete WebSocket-Nachricht empfangen. Das Datenformat kann Text oder Binär sein. Die Art und Weise, wie WebSocket-Nachrichten verarbeitet werden, hängt vom Anwendungsszenario ab. Beispielsweise müssen Online-Chat-Anwendungen möglicherweise Funktionen wie Broadcasting und Punkt-zu-Punkt-Chat implementieren, während Spieleanwendungen Echtzeitkommunikation auf Mikrosekundenebene implementieren müssen.
Hier ist ein einfaches Beispiel, das die empfangene Nachricht ausdruckt und dem Client antwortet:
$wsWorker->onMessage = function($connection, $data) { echo "Received message: {$data} "; $connection->send("Received: {$data}"); };
Status der WebSocket-Verbindung
Nachdem die WebSocket-Verbindung hergestellt wurde, bleibt die Verbindung zwischen dem Client und dem Server offen. Durch die Rückruffunktion onClose können wir den Fall einer Verbindungsunterbrechung bewältigen:
$wsWorker->onClose = function($connection) { echo "Connection closed "; };
Workerman kann problemlos in andere Frameworks integriert werden. Hier nehmen wir das Laravel-Framework als Beispiel, um vorzustellen, wie Workerman zum Implementieren eines WebSocket-Servers in Laravel verwendet wird.
Zuerst müssen wir Workerman in unserem Laravel-Projekt installieren:
composer require workerman/workerman
Als nächstes können wir einen benutzerdefinierten Artisan-Befehl erstellen, um den WebSocket-Server zu starten:
php artisan make:command WebSocketServer
Dann schreiben Sie den Code in app/Console/Commands/WebSocketServer.php Datei:
<?php namespace AppConsoleCommands; use IlluminateConsoleCommand; use WorkermanWorker; class WebSocketServer extends Command { // 命令名称 protected $name = 'websocket:server'; // 命令描述 protected $description = 'Start WebSocket server'; // 执行命令 public function handle() { // 创建Worker实例,监听8080端口 $wsWorker = new Worker("websocket://0.0.0.0:8080"); // 进程数量 $wsWorker->count = 4; // 处理连接事件 $wsWorker->onConnect = function($connection) { echo "New connection "; }; // 处理消息事件 $wsWorker->onMessage = function($connection, $data) { // 处理消息 }; // 运行Worker Worker::runAll(); } }
Abschließend können wir den WebSocket-Server mit dem folgenden Befehl starten:
php artisan websocket:server
Wie Sie sehen, ist die Implementierung eines WebSocket-Servers mithilfe von Workerman sehr einfach und lässt sich problemlos in andere Frameworks integrieren.
Das Folgende ist ein vollständiges WebSocket-Serverbeispiel, das vom Client gesendete Nachrichten empfangen, eine einfache Verarbeitung durchführen und die Verarbeitungsergebnisse an den Client antworten kann:
count = 4; // 处理WebSocket连接的回调函数 $wsWorker->onConnect = function($connection) { echo "New connection "; }; // 处理WebSocket消息的回调函数 $wsWorker->onMessage = function($connection, $data) { echo "Received message: {$data} "; $result = "Received: {$data}"; $connection->send($result); }; // 处理连接断开事件的回调函数 $wsWorker->onClose = function($connection) { echo "Connection closed "; }; // 启动Worker Worker::runAll();
Das Obige wird mit Workerman Through implementiert Als ich diesen Artikel einleitete, glaube ich, dass die Leser das relevante technische Wissen über den gesamten Inhalt des WebSocket-Servers beherrschen und diese Techniken auch für die Entwicklung in tatsächlichen Projekten verwenden können.
Das obige ist der detaillierte Inhalt vonWorkerman-Entwicklung: So implementieren Sie einen WebSocket-Server. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!