Aktueller Standort: Startseite> Neueste Artikel> Erstellen Sie einen Blockierserver in PHP: Von Socket_Create zu Socket_Set_Block

Erstellen Sie einen Blockierserver in PHP: Von Socket_Create zu Socket_Set_Block

gitbox 2025-05-26

Durch die Implementierung eines Socket-basierten Blockierungsservers in PHP können wir das zugrunde liegende Netzwerkkommunikationsprinzip verstehen. Der Blockierungsmodus bedeutet, dass der Server wartet, bis die Daten gelesen oder geschrieben werden, bis Daten verarbeitet werden oder die Verbindung fertig ist. In diesem Artikel wird Schritt für Schritt analysiert, wie die Socket -Erweiterung von PHP verwendet wird, vom Erstellen von Sockets bis hin zum Einstellen im Blockierungsmodus und einem einfachen Blockierungsserver.

1. Vorbereitung: Stellen Sie sicher, dass die Socket -Erweiterung aktiviert ist

Stellen Sie zunächst sicher, dass die Socket -Erweiterung in der PHP -Umgebung aktiviert ist. Finden und mit der folgenden Zeile in Php.ini (falls vorhanden):

 extension=sockets

Verwenden Sie den Befehl PHP -M, um zu überprüfen, ob die Erweiterung aktiviert ist:

 php -m | grep sockets

Wenn Sie Sockets sehen können, ist die Erweiterung aktiviert.

2. Erstellen Sie einen TCP -Server mit Socket

Im Folgenden sind die grundlegenden Schritte zum Erstellen einer Socket und Schritt für Schritt die Rolle jeder Funktion ein.

1. Erstellen Sie eine Steckdose

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n");
}

Hier erstellen wir eine TCP -Socket ( SOCK_Stream ) basierend auf IPv4 ( AF_Inet ).

2. Setzen Sie Socket -Optionen (optional)

Einige Socket -Optionen können festgelegt werden, z. B. die Wiederverwendung von Port:

 socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

3. Binden Sie Socket

 $host = '0.0.0.0';
$port = 9000;
if (!socket_bind($socket, $host, $port)) {
    die("socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

4. Hören Sie sich den Port an

 if (!socket_listen($socket, 5)) {
    die("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

5 gibt die maximale Anzahl an ausstehender Verbindungsanforderungen an.

3.. Setzen Sie den Blockierungsmodus

Verwenden Sie Socket_Set_Block , um den Socket auf den Blockierungsmodus zu setzen.

 if (!socket_set_block($socket)) {
    die("socket_set_block() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

Sobald der Blockierungsmodus eingestellt ist, blockieren nachfolgende Socket_accept , Socket_read und andere Funktionen, bis der Betrieb abgeschlossen ist.

4. Akzeptieren Sie die Verbindung und lesen Sie Daten

 echo "Der Server wird gestartet,Hören Sie sich Port an $port...\n";

while (true) {
    $clientSocket = socket_accept($socket);
    if ($clientSocket === false) {
        echo "socket_accept() failed: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    $input = socket_read($clientSocket, 1024);
    if ($input === false) {
        echo "socket_read() failed: " . socket_strerror(socket_last_error($clientSocket)) . "\n";
    } else {
        $input = trim($input);
        echo "Eine Nachricht erhalten: $input\n";

        $response = "Du hast es geschickt:$input\n";
        socket_write($clientSocket, $response, strlen($response));
    }

    socket_close($clientSocket);
}

5. Den Server herunterfahren

Vergessen Sie nicht, den Hauptbuchsen zu schließen, wenn Sie beenden müssen:

 socket_close($socket);

6. Zugangstest

Sie können einen Befehlszeilen -Client wie den Telnet -Verbindungstest verwenden:

 telnet gitbox.net 9000

Oder schreiben Sie einen einfachen PHP -Client für Verbindungstests.

Zusammenfassen

Von Socket_Create an socket_set_block erstellen wir einen vollständigen Blockierserver. Dieser Modus eignet sich für einfache Netzwerkkommunikationsanwendungen wie Unterricht, Debugging oder Szenarien mit geringer Konsequenz. Bei hohen Parallelitätsszenarien wird empfohlen, den nicht blockierenden Modus zu verwenden oder Select / Poll zu verwenden, um effizientere Ereignisschleifen zu erreichen.

Durch die praktischen Schritte in diesem Artikel können Sie den gesamten Prozess des Erstellens von Blockierungsservern in PHP beherrschen und eine solide Grundlage für eine weitere eingehende Netzwerkprogrammierung legen.