In Webanwendungen bietet WebSocket eine Möglichkeit, einen vollständigen Duplex -Kommunikationskanal zwischen dem Client und dem Server einzurichten. Im Vergleich zu herkömmlichen HTTP -Anforderungen kann WebSocket dem Server aktiv Nachrichten an den Client weitergeben. Obwohl PHP im traditionellen Sinne nicht die am besten geeignete Sprache für lange Verbindungen ist, kann es immer noch einfache WebSocket -Dienste durch zugrunde liegende Socket -Programmierung implementieren. In diesem Artikel wird vorgestellt, wie die Funktion "Socket_Accept" von PHP verwendet wird, um die Kommunikation mit dem Front-End-WebSocket-Client zu erreichen.
Um die Socket -Funktionalität von PHP zu verwenden, müssen Sie sicherstellen, dass die Sockets -Erweiterung in PHP aktiviert ist. Es kann in php.ini aktiviert werden:
extension=sockets
Starten Sie dann Ihren PHP -Service neu.
Der Handshake -Prozess von WebSocket folgt bestimmten Protokollspezifikationen. Wir müssen nach Erhalt der Client-Anfrage eine Handshake-Bestätigung auf HTTP-Protokollebene durchführen, bevor wir die WebSocket-Datenrahmenkommunikation durchführen können.
Hier ist ein vollständiges Beispiel für PHP -Skript:
<?php
$host = '0.0.0.0';
$port = 8080;
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, $host, $port);
socket_listen($serverSocket);
echo "WebSocket Der Server beginnt bei $host:$port\n";
while (true) {
$clientSocket = socket_accept($serverSocket);
if ($clientSocket === false) {
continue;
}
// Lesen Sie die Client -Anfrage -Header
$request = socket_read($clientSocket, 1024);
if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $request, $matches)) {
$key = trim($matches[1]);
$acceptKey = base64_encode(pack('H*', sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
$headers = "HTTP/1.1 101 Switching Protocols\r\n";
$headers .= "Upgrade: websocket\r\n";
$headers .= "Connection: Upgrade\r\n";
$headers .= "Sec-WebSocket-Accept: $acceptKey\r\n\r\n";
socket_write($clientSocket, $headers);
echo "WebSocket Handschlag ist abgeschlossen。\n";
}
// Einfaches Lesen und Senden WebSocket Information
while (true) {
$data = socket_read($clientSocket, 2048);
if ($data === false) {
break;
}
$decoded = unmask($data);
echo "接收到客户端Information: $decoded\n";
$response = mask("Was Sie gesendet haben, ist: $decoded");
socket_write($clientSocket, $response);
}
socket_close($clientSocket);
}
socket_close($serverSocket);
// Analyse WebSocket rahmen
function unmask($payload) {
$length = ord($payload[1]) & 127;
if ($length == 126) {
$masks = substr($payload, 4, 4);
$data = substr($payload, 8);
} elseif ($length == 127) {
$masks = substr($payload, 10, 4);
$data = substr($payload, 14);
} else {
$masks = substr($payload, 2, 4);
$data = substr($payload, 6);
}
$text = '';
for ($i = 0; $i < strlen($data); ++$i) {
$text .= $data[$i] ^ $masks[$i % 4];
}
return $text;
}
// Struktur WebSocket 数据rahmen
function mask($text) {
$b1 = 0x81; // FIN=1, opcode=0x1 (text)
$length = strlen($text);
if ($length <= 125) {
$header = pack('CC', $b1, $length);
} elseif ($length <= 65535) {
$header = pack('CCn', $b1, 126, $length);
} else {
$header = pack('CCNN', $b1, 127, 0, $length);
}
return $header . $text;
}
?>
Am vorderen Ende können Sie auf folgende Weise mit dem PHP WebSocket -Dienst kommunizieren:
<script>
const socket = new WebSocket("ws://m66.net:8080");
socket.onopen = () => {
console.log("Die Verbindung wurde hergestellt");
socket.send("Hallo PHP WebSocket!");
};
socket.onmessage = (event) => {
console.log("收到Information:", event.data);
};
socket.onclose = () => {
console.log("Die Verbindung ist geschlossen");
};
</script>
Hinweis: WS: //m66.net: 8080 Hier ist die Adresse Ihres Servers. Bitte setzen Sie den Domänennamen und die Portzuordnung gemäß der Bereitstellungsumgebung ein.
Durch die Verwendung von PHPs Socket_accept und zugehörigen Funktionen können wir eine grundlegende WebSocket -Serverlogik implementieren. Diese Methode eignet sich zum Lernen und experimentellen Zwecken. Für Produktionsumgebungen wird empfohlen, höhere Leistungslösungen wie Ratschen, SWOOLE oder einen dedizierten WebSocket -Server (wie Node.js, GO) zu verwenden.
Obwohl PHP nicht für lange Verbindungen ausgelegt ist, ist die zugrunde liegende Steckdose leistungsstark und kann die grundlegenden bidirektionalen Kommunikationsbedürfnisse erfüllen. In den Beispielen in diesem Artikel können Sie einen einfachen Php WebSocket-Server erstellen, um mit dem Front-End-Client zu interagieren.