Aktueller Standort: Startseite> Neueste Artikel> So debuggen Sie das Socket -Verhalten nach Socket_Set_Block

So debuggen Sie das Socket -Verhalten nach Socket_Set_Block

gitbox 2025-05-29

1. SOCKKET_SET_BLOCK Kurzbeschreibung

Socket_Set_Block ist eine Funktion, die von der PHP -Socket -Erweiterung bereitgestellt wird, um Socket auf den Blockierungsmodus zu setzen:

 bool socket_set_block ( resource $socket )

Der Blockierungsmodus bedeutet, dass Funktionsaufrufe wie Socket_read , Socket_Write usw. Blockausführung blockieren, bis die Daten lesbar oder geschrieben sind.


2. Warum muss ich eine blockierende Steckdose debuggen?

  • Im Blockierungsmodus kann das Programm bei einem Funktionsaufruf stehen, was dazu führt, dass die Anwendung nicht mehr reagiert.

  • Das Verständnis des Blockierungsverhaltens hilft dabei, Probleme zu lokalisieren, bei denen Deadlocks oder lange Warten.

  • Es ist zweckmäßig, den tatsächlichen Daten- und Empfangsprozess von Daten zu beherrschen und die Richtigkeit der Netzwerkkommunikation sicherzustellen.


3.. Ideen und Methoden debuggen

3.1 Timeout -Einstellungen verwenden, um das Debuggen zu unterstützen

Obwohl der Blockierungsmodus standardmäßig unendlich wartet, kann er verwendet werden, um die Zeitüberschreitungseinstellung des Sockets zu entsprechen, um die Wartezeit zu begrenzen, um eine dauerhafte Blockierung des Programms zu vermeiden.

 // Setzen Sie die Lektüre -Timeout auf5Zweite,Timeout schreiben als5Zweite
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ['sec' => 5, 'usec' => 0]);

3.2 Debug -Protokolle aufnehmen

Drucken Sie die Protokolle vor und nach jedem Schlüsselbetriebsbetrieb, um zu bestimmen, welcher Schritt das Programm blockiert.

 echo "Bereit zum Lesen von Daten...\n";
$data = socket_read($socket, 1024);
if ($data === false) {
    echo "Read fehlgeschlagen,Fehler:" . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "Erfolgreich lesen,Inhalt:" . $data . "\n";
}

3.3 Verwenden Sie Socket_Select, um lesbar zu erkennen und Status zu schreiben

Wenn Sie im Blockierungsmodus nicht sicher sind, ob der Socket betrieben werden kann, können Sie zuerst Socket_Select verwenden, um den Status zu bestimmen.

 $read = [$socket];
$write = null;
$except = null;
$tv_sec = 10; // 10ZweiteAuszeit

$result = socket_select($read, $write, $except, $tv_sec);
if ($result === false) {
    echo "select Ein Fehler ist aufgetreten:" . socket_strerror(socket_last_error()) . "\n";
} elseif ($result === 0) {
    echo "select Auszeit,Keine Daten zum Lesen\n";
} else {
    echo "socket Lesbar,Bereit zum Lesen von Daten\n";
    $data = socket_read($socket, 1024);
    echo "读取Inhalt:" . $data . "\n";
}

4. Tatsächliches Beispiel: Blockierung und Debugg -Lesungen einrichten

Das folgende Beispiel zeigt, wie Sie einen Client -Socket erstellen, den Blockierungsmodus festlegen, Zeitüberschreitungen und Protokolle kombinieren und das Lese- und Schreibverhalten der Socket debuggen.

 <?php
// erstellen TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create scheitern: " . socket_strerror(socket_last_error()) . "\n");
}

// Stellen Sie eine Verbindung zum Server her(Hier verwendet gitbox.net Als Beispiel Domain -Name)
$server = 'gitbox.net';
$port = 80;
if (!socket_connect($socket, $server, $port)) {
    die("socket_connect scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// Einstellen auf den Blockierungsmodus
if (!socket_set_block($socket)) {
    die("socket_set_block scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}
echo "Der Blockierungsmodus wurde eingestellt\n";

// 设置接收Auszeit5Zweite,Vermeiden Sie unendliche Blockade
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]);

// schicken HTTP GET fragen
$request = "GET / HTTP/1.1\r\nHost: $server\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request);

echo "fragen已schicken,Lesen Sie die Antwort...\n";

// Antwortdaten lesen
$response = '';
while (true) {
    $buf = socket_read($socket, 2048);
    if ($buf === false) {
        echo "读取Fehler: " . socket_strerror(socket_last_error($socket)) . "\n";
        break;
    } elseif ($buf === '') {
        // Schließen Sie die Verbindung aus der Ferne aus
        echo "Die Fernverbindung ist geschlossen\n";
        break;
    }
    $response .= $buf;
}

echo "响应Inhalt:\n";
echo $response;

socket_close($socket);
?>

5. Zusammenfassung

  • Nach dem Einstellen des Blockierungsmodus mit Socket_Set_Block wird die Les- und Schreibfunktion warten, bis er abgeschlossen ist oder ein Fehler auftritt.

  • Durch die Kombination von Zeitüberschreitungseinstellungen und die Protokollausgabe können Deadlocks effektiv vermieden und das Debuggen beitragen.

  • Die Verwendung von Socket_Select , um den Socket -Status zu bestimmen, kann die Debugging- und Steuerfunktionen verbessern.

  • In der Praxis ist das Drucken mehr wichtiger Schrittinformationen und die Analyse der Blockierungspunkte der Schlüssel zur Lösung des Problems.

Durch die oben genannten Methoden kann das Socket -Verhalten im Blockierungsmodus effektiv debugiert werden, um die Stabilität und Zuverlässigkeit der Netzwerkkommunikation zu gewährleisten.