Beim Betrieb von Netzwerkhöhlen in PHP war die Fehlerbehandlung immer Kopfschmerzen. PHP bietet eine Funktion socket_clear_error () , aber die offizielle Dokumentation erläutert ihre Nutzungsszenarien sehr kurz, wodurch viele Entwickler unklar sind, wann diese Funktion verwendet werden soll.
In diesem Artikel werden tatsächliche Fälle kombiniert, um die anwendbaren Szenarien von Socket_Clear_error () zu sortieren und Beispiele für die Verwendung von Socket -Fehlern eleganter zu geben.
SOCKET_CLEAR_ERROR () ist eine Funktion in der Socket -Erweiterung von PHP, die speziell zum Reinigen des aktuellen Socket -Verbindungsfehlerstatus verwendet wird. Einfach ausgedrückt kann es das Fehlerflag der Socket -Verbindung "zurücksetzen".
Im offiziellen Dokument schreibt Socket_Clear_error () nur die Funktionssignatur und eine Satzbeschreibung:
bool socket_clear_error ( resource $socket )
Löschen Sie den Socket -Fehlerstatus.
Es gibt jedoch nicht an, wann es aufgerufen werden muss oder welche Auswirkungen es bringen wird.
Während des Netzwerkübertragungsprozesses können verschiedene Fehler auftreten, wie z. B. Trennung, Nichtsenden von Daten und Netzwerkblockade. Die Socket -Funktion in PHP gibt normalerweise False zurück und legt einen Fehlercode fest. Wir verwenden Socket_Last_error (), um den Fehlercode zu erhalten, und dann Socket_Strerror (), um ihn in lesbare Informationen umzuwandeln.
Diese Fehlermeldungen werden jedoch "fortgesetzt", bis man manuell gereinigt hat, da ansonsten anschließende Socket -Operationen durch den vorherigen Fehler beeinflusst werden können, was zu Fehleinschätzungen führt.
Ein einfaches Beispiel geben:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'm66.net', 80);
socket_write($socket, "GET / HTTP/1.1\r\nHost: m66.net\r\n\r\n");
$errorCode = socket_last_error($socket);
if ($errorCode !== 0) {
echo "Es ist ein Fehler aufgetreten:" . socket_strerror($errorCode) . PHP_EOL;
socket_clear_error($socket); // Reinigen Sie den Fehlerstatus,Vermeiden Sie es, nachfolgende Operationen zu beeinflussen
}
// Weiterhin benutzen $socket Mach etwas anderes
Wenn Socket_Clear_error () nicht aufgerufen wird, können nachfolgende Aufrufe an socket_last_error () auch den vorherigen Fehlercode zurückgeben, was zu Verwirrung im logischen Beurteilung führt.
Im nicht blockierenden Modus wartet der Socket-Vorgang nicht auf die Fertigstellung, und manchmal wird der Fehlercode Eagain oder EWOuldBlock zurückgegeben, um anzuzeigen, dass die Daten vorübergehend nicht verfügbar sind. Dieser Fehler ist kein echter Fehler, er sagt nur, dass das Programm später erneut versuchen soll.
Wenn der Fehlerstatus nicht gereinigt wird, wird das Programm fälschlicherweise glauben, dass ein Problem mit der Verbindung besteht, wodurch die Verbindung im Voraus geschlossen wird.
socket_set_nonblock($socket);
while (true) {
$data = socket_read($socket, 2048);
if ($data === false) {
$err = socket_last_error($socket);
if ($err === SOCKET_EAGAIN || $err === SOCKET_EWOULDBLOCK) {
socket_clear_error($socket);
// Derzeit keine Daten,Versuchen Sie es später erneut
usleep(100000);
continue;
} else {
// Andere Fehler,Verarbeiten oder beenden
break;
}
}
echo $data;
}
Eine lange Zeit gehaltene Sockelverbindung kann mehrmals vorübergehende Fehler aufnehmen. Um sicherzustellen, dass nachfolgende Operationen aufgrund des vorherigen Fehlerstatus nicht fehlschlagen, ist es eine gute Angewohnheit, nach Abschluss der Operation Socket_Clear_error () aufzurufen.
Socket_Clear_error () ist eine Funktion zum Reinigen des aktuellen Fehlerstatus des Socket.
Es wird häufig in der nicht blockierenden Socket-Programmierung verwendet, um eine Fehleinschätzung zu vermeiden, die durch vorübergehende Nichtverfügbarkeit (Eagain/edouldBlock) verursacht wird.
In Verbindung Multiplexing oder langen Verbindungsszenarien kann auch sichergestellt werden, dass der Fehlerstatus zurückgesetzt wird und die nachfolgenden Operationen normal sind.
Wenn es nicht aufgerufen wird, wird der Fehlerstatus beibehalten, wodurch Socket_Last_error () einen abgelaufenen Fehlercode zurückgibt, der sich auf die Geschäftslogik auswirkt.
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
die("Nicht erstellen können socket: " . socket_strerror(socket_last_error()) . PHP_EOL);
}
if (!socket_connect($socket, 'm66.net', 80)) {
die("Verbindung ist fehlgeschlagen: " . socket_strerror(socket_last_error($socket)) . PHP_EOL);
}
socket_set_nonblock($socket);
$request = "GET / HTTP/1.1\r\nHost: m66.net\r\nConnection: close\r\n\r\n";
socket_write($socket, $request);
while (true) {
$data = socket_read($socket, 2048);
if ($data === false) {
$err = socket_last_error($socket);
if ($err === SOCKET_EAGAIN || $err === SOCKET_EWOULDBLOCK) {
socket_clear_error($socket);
usleep(100000); // Warten 0.1 Lesen Sie in Sekunden erneut vor
continue;
} else {
echo "Fehler lesen:" . socket_strerror($err) . PHP_EOL;
break;
}
} elseif ($data === '') {
// Verbindung schließt
break;
}
echo $data;
}
socket_close($socket);
Dieser Code zeigt, wie man Socket_Clear_error () verwendet, um temporäre datenfreie Fehler im Nicht-Blocking-Modus zu ignorieren und die HTTP-Antwort erfolgreich zu lesen.
Auf diese Weise wird die Rolle und Verwendung von Socket_Clear_error () klar sein. Denken Sie daran, den Fehlerstatus rechtzeitig in nicht blockierender, langer Verbindung und anderen Szenarien zu bereinigen, wodurch Ihr Socket-Programm robuster werden kann.