Aktueller Standort: Startseite> Neueste Artikel> Kommunikation mit Front-End-WebSocket-Client: Implementierungsidee von Socket_accept

Kommunikation mit Front-End-WebSocket-Client: Implementierungsidee von Socket_accept

M66 2025-05-20

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.

Voraussetzungen

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.

Erstellen Sie einen WebSocket -Server

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;
}
?>

Beispiel für Front-End-Client

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.

Zusammenfassen

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.