Wenn die von PHP bereitgestellten Sockelfunktionen hoch verfügbare Netzwerkdienste erstellen, bieten Entwicklern die starken Kontrollfunktionen. Socket_Set_Block () ist eine der wichtigen Funktionen, die den Socket für den Blockierungsmodus festlegen und so das Warteverhalten des Programms beim Lesen oder Schreiben von Daten kontrollieren. Mit einem angemessenen Zeitüberschreitungsmechanismus können wir eine robuste und gut verfügbare Verbindungsmanagementlösung erstellen.
Bei der Programmierung mit PHPs Socket gibt es wesentliche Unterschiede im Verhalten von Blockier- und Nicht-Blocking-Modi:
Blockierungsmodus : Während eines Lese- oder Schreibvorgangs wird das Programm "Warten", bis die Bedingung erfüllt ist oder ein Fehler auftritt.
Nicht-Blocking-Modus : Die Operation kehrt sofort zurück und wartet nicht. Auf diese Weise müssen Entwickler Details wie Verbindungsstatus, Datenvorbereitung usw. extern verwalten.
Die Funktion von socket_set_block () besteht darin, den Socket explizit auf den Blockierungsmodus einzustellen, um sicherzustellen, dass die Operation beim Aufrufen von Socket_Read () oder Socket_Write () abgeschlossen wird.
Der Verbindungsmechanismus mit hoher Verfügbarkeit sollte die folgenden Eigenschaften aufweisen:
Kann erkennen, ob die Verbindung rechtzeitig erreichbar ist;
Vermeiden Sie den langfristigen Ablauf des Programms aufgrund von Blockade;
Wechseln Sie im Falle von Server- oder Netzwerkproblemen schnell oder versuchen Sie es erneut.
Angemessene Ressourcenveröffentlichung und Ausnahmebehandlung.
Zu diesem Zeitpunkt ist der Blockierungsmodus in Kombination mit der Zeitlimiteinstellung besonders kritisch. PHP stellt die Funktion von Socket_Set_Option () zur Festlegung der Zeitüberschreitungszeit bereit.
Das Folgende ist eine typische Implementierungslogik. Die Schritte sind wie folgt:
Eine Steckdose erstellen;
Setzen Sie die Zeitüberschreitungszeit;
Auf den Blockierungsmodus einstellen;
Versuchen Sie sich zu verbinden;
Überprüfen Sie den Verbindungsstatus;
Normales Lesen und Schreiben oder Timeout -Verarbeitung.
Der Beispielcode lautet wie folgt:
<?php
$host = 'gitbox.net';
$port = 80;
// erstellen socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()));
}
// Legen Sie die Verbindungszeitüberschreitungszeit ein(Sekunden)
$timeout = ['sec' => 5, 'usec' => 0];
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout);
// Einstellen auf den Blockierungsmodus
socket_set_block($socket);
// Eine Verbindung einleiten
$result = @socket_connect($socket, $host, $port);
if ($result === false) {
$errorCode = socket_last_error($socket);
$errorMsg = socket_strerror($errorCode);
echo "Verbindung ist fehlgeschlagen: [$errorCode] $errorMsg\n";
socket_close($socket);
exit;
}
// Senden Sie eine Anfrage nach erfolgreicher Verbindung
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// Lesen Sie die Antwort
$response = '';
while ($chunk = socket_read($socket, 2048)) {
$response .= $chunk;
}
echo "Serverantwort:\n$response";
socket_close($socket);
?>
SOCKKET_SET_OPTION () Konfiguriert die Zeitüberschreitungszeit zum Lesen und Senden. Wenn der Zielhost nicht mehr reagiert, blockiert er nicht auf unbestimmte Zeit.
Socket_Set_Block () stellt sicher, dass das Lesen und Schreiben der sequentiellen Logik entspricht und keine häufige Umfragen erfordern.
Die Fehlerbehandlung sollte jedem Schritt folgen, insbesondere in Socket_Connect () , da Netzwerkprobleme die häufigste Quelle für Ausnahmen sind.
Dieser Ansatz gilt für die meisten TCP -Netzwerkanforderungen, einschließlich:
HTTP -Schnittstelle Herzschlag Erkennung;
Intranet -Service -Statusüberwachung;
Verteilte Gesundheitsüberprüfungen zwischen Noten;
Einfacher Lastausgleich vor der Erkennung.
Sein Vorteil ist, dass es einfach erreicht wird, eine klare Kontrolle hat und nicht auf zusätzliche Erweiterungen beruht. Es eignet sich für Skriptautomatisierungsaufgaben oder leichte Dienste.
Durch die Verwendung von Socket_Set_Block () mit dem entsprechenden Zeitleitungsmechanismus kann PHP bei der Behandlung von Netzwerkverbindungen widerstandsfähiger und fehlertoleranter werden. Insbesondere in Umgebungen mit hohen Zuverlässigkeitsanforderungen ist die rationale Kontrolle des Blockierungsverhaltens und Zeitlimitstrategien ein unverzichtbarer Bestandteil des Aufbaus eines hoch verfügbaren Systems. Durch den oben genannten Code und die obigen Ideen können Sie einen umfassenderen Verbindungspool, einen Mechanismus oder einen Serviceüberwachungssystem basierend auf den tatsächlichen Anforderungen erstellen.