Mit der Popularität des Internets und mobiler Geräte benötigen Menschen zunehmend Tools für die Zusammenarbeit in Echtzeit, um die Arbeitseffizienz zu verbessern. Vor diesem Hintergrund sind Features wie Instant Messaging und kollaboratives Bearbeiten in Echtzeit-Collaboration-Tools zu immer beliebteren Anforderungen geworden. In diesem Artikel wird erläutert, wie Sie mit Hilfe von PHP und WebSocket ein webbasiertes Echtzeit-Collaboration-Tool implementieren. Es werden auch relevante Codebeispiele bereitgestellt.
WebSocket ist eine neue Art von Web-Kommunikationsprotokoll. Es basiert auf dem TCP-Protokoll anstelle des HTTP-Protokolls und kann bidirektionale Kommunikationsfunktionen bereitstellen. Im Vergleich zur Ajax-Abfragetechnologie bietet WebSocket die Vorteile einer starken Echtzeitleistung und einer hohen Kommunikationseffizienz.
Wenn Sie zuvor Daten in Echtzeit an den Browser übertragen wollten, verwendeten Sie normalerweise die Long-Polling-Technologie, das heißt, der Client sendete eine Anfrage an den Server und wartete auf eine Antwort, bis neue Daten verfügbar waren, bevor er eine Antwort zurückgab . Das Problem bei diesem Ansatz besteht darin, dass Anfragen und Antworten paarweise erfolgen. Wenn Anfragen häufig sind, wird der Server stark belastet. WebSocket kann nach dem Aufbau der Kommunikation eine langfristige Verbindung aufrechterhalten und die Funktion des Servers realisieren, der aktiv Nachrichten an den Client sendet.
Das Kommunikationsprotokoll von WebSocket verwendet einen HTTP-ähnlichen Handshake, um eine neue Sitzung zu starten, und dann führen beide Enden eine bidirektionale Datenübertragung durch. Das WebSocket-Kommunikationsprotokoll kann eine Verbindung über das normale HTTP-Protokoll herstellen und dann in eine WebSocket-Verbindung konvertieren, sodass keine Verbindung über eine spezielle Methode oder einen speziellen Port erforderlich ist.
Zuerst müssen wir im PHP-Code auf der Serverseite eine WebSocketServer-Klasse erstellen und zugehörige Methoden implementieren:
class WebSocketServer { public function __construct($host, $port){ $this->host = $host; $this->port = $port; $this->sockets = array(); $this->users = array(); } public function run(){ $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_bind($server, $this->host, $this->port); socket_listen($server); $this->sockets[] = $server; echo "WebSocket服务器运行在 $this->host:$this->port "; while(true){ $new_sockets = $this->sockets; $write = NULL; $except = NULL; socket_select($new_sockets, $write, $except, NULL); foreach($new_sockets as $socket){ if ($socket == $server){ $client = socket_accept($server); $this->sockets[] = $client; $this->users[] = array('socket'=>$client); } else { $bytes = @socket_recv($socket, $buffer, 1024, MSG_DONTWAIT); if ($bytes == 0) { $index = $this->find_user_by_socket($socket); if ($index >= 0) { array_splice($this->users, $index, 1); } socket_close($socket); $key = array_search($socket, $this->sockets); array_splice($this->sockets, $key, 1); } else { $index = $this->find_user_by_socket($socket); if($index >= 0) { $msg = $buffer; $this->handle_message($msg, $this->users[$index]); } } } } } } private function find_user_by_socket($socket){ $found = -1; foreach($this->users as $index => $user){ if ($user['socket'] == $socket){ $found = $index; break; } } return $found; } private function handle_message($msg, $user) { // 处理新消息 } }
Im WebSocket-Protokoll beginnt eine Nachricht mit einem Längenheader von 4 bis 10 Bytes , gefolgt von tatsächlichen Daten. Im obigen Code müssen wir den Längenheader analysieren und dann den Datenteil der entsprechenden Länge lesen.
private function handle_message($msg, $user) { if(strlen($msg) === 0) { return; } $code = ord(substr($msg, 0, 1)) & 0x0F; switch ($code){ case 0x01: // 文本数据 $msg = substr($msg, 1); break; case 0x02: // 二进制数据 $msg = substr($msg, 1); break; case 0x08: // 连接关闭 $index = $this->find_user_by_socket($user['socket']); if ($index >= 0) { array_splice($this->users, $index, 1); } socket_close($user['socket']); $key = array_search($user['socket'], $this->sockets); array_splice($this->sockets, $key, 1); return; case 0x09: // ping case 0x0A: // pong return; default: return; } // 处理新消息 }
In der handle_message-Methode können wir neue vom Client empfangene Nachrichten verarbeiten, z. B. Dumping und Senden an andere Clients.
Auf der Clientseite müssen wir JavaScript verwenden, um eine WebSocket-Verbindung herzustellen und Nachrichten zu senden und zu empfangen. Das Folgende ist der JavaScript-Code zum Herstellen einer Verbindung zum WebSocket-Server:
var ws = new WebSocket("ws://localhost:8080/"); ws.onopen = function() { console.log("Connected to WebSocket server"); }; ws.onmessage = function(evt) { console.log("Received message: " + evt.data); }; ws.onclose = function(evt) { console.log("Disconnected from WebSocket server"); };
Im obigen Code verwenden wir den WebSocket-Konstruktor, um ein WebSocket-Objekt zu erstellen und es mit dem WebSocket-Server zu verbinden. Wir haben außerdem mehrere Ereignis-Listener (onopen, onmessage und onclose) eingerichtet, um den WebSocket-Verbindungsstatus und empfangene Nachrichten zu überwachen.
Wenn wir Daten an den WebSocket-Server senden möchten, können wir die Sendemethode des WebSocket-Objekts verwenden:
ws.send("Hello, WebSocket server!");
Wenn eine neue Nachricht vom WebSocket-Server empfangen wird, wird das Ereignis onmessage ausgelöst und wir können die empfangene Nachricht abrufen Nachricht vom Ereignisobjekt an die Daten.
Mit der Unterstützung der WebSocket-Kommunikation können wir echte Collaboration-Tool-Anwendungen entwickeln. In Kollaborationstools müssen die folgenden Funktionen implementiert werden:
Wir können diese trennen Funktionen werden separat in verschiedene PHP-Klassen implementiert und entsprechend den tatsächlichen Geschäftsanforderungen verfeinert. Das Folgende ist ein Beispiel:
class WebSocketChat { private $users = array(); public function onOpen($user){ $this->users[$user['id']] = $user; $this->sendToAll(array('type'=>'notice','from'=>'System','msg'=>"{$user['name']}进入聊天室")); } public function onMessage($user, $msg){ $this->sendToAll(array('type'=>'msg','from'=>$user['name'],'msg'=>$msg)); } public function onClose($user){ unset($this->users[$user['id']]); $this->sendToAll(array('type'=>'notice','from'=>'System','msg'=>"{$user['name']}离开聊天室")); } private function sendToAll($msg){ foreach($this->users as $user){ $this->send($user, $msg); } } private function send($user, $msg){ socket_write($user['socket'], $this->encode(json_encode($msg))); } private function encode($msg){ $len = strlen($msg); if($len <= 125){ } if($len <= 65535){ } } }
Im obigen Beispiel haben wir einen einfachen Chatroom implementiert, einschließlich Anmelden, Abmelden, Senden von Nachrichten und anderen Funktionen. In der WebSocketChat-Klasse verwalten wir eine Liste von Benutzern und fügen einen neuen Benutzer über die onOpen-Methode hinzu, wenn der Benutzer eine Verbindung herstellt. Wenn wir eine Nachricht von einem Benutzer erhalten, rufen wir die Methode sendToAll auf, um die Nachricht an alle verbundenen Benutzer zu senden. Wenn ein Benutzer die Verbindung trennt, entfernen wir den Benutzer aus der Benutzerliste und benachrichtigen andere Benutzer darüber, dass der Benutzer die Verbindung verlassen hat.
In diesem Artikel haben wir vorgestellt, wie man mit Hilfe von PHP und WebSocket ein webbasiertes Echtzeit-Collaboration-Tool implementiert, und relevante Codebeispiele bereitgestellt. Mit der Popularität des Internets und mobiler Geräte wird die Nachfrage nach Echtzeit-Collaboration-Tools immer größer. Entwickler können Sekundärentwicklungen basierend auf tatsächlichen Anforderungen durchführen, um die Benutzeranforderungen besser zu erfüllen.
Das obige ist der detaillierte Inhalt vonSo entwickeln Sie Echtzeit-Collaboration-Tools mit PHP und WebSocket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!