Bei der Programmierung von Netzwerken in PHP ist die Socket -Programmierung eine übliche und zugrunde liegende Kommunikationsmethode. Für Szenarien, in denen das Blockieren von Lesen erforderlich ist, werden die Funktionen von Socket_Set_Block und Socket_read vernünftigerweise verwendet, um einen effizienten und stabilen Datenempfang zu erzielen. In diesem Artikel werden die Techniken für die Verwendung dieser beiden Funktionen in Kombination mit Beispielen ausführlich eingebracht.
Blockierungsmodus : Wenn Sie eine Lesefunktion aufrufen, blockiert das Programm, wenn die Daten nicht fertig sind, bis die Daten lesbar oder ein Zeitübergang sind.
Nicht-Blocking-Modus : Die Lesefunktion kehrt sofort zurück. Wenn keine Daten lesbar sind, wird leer oder ein Fehler zurückgegeben, und das Programm kann weiterhin andere Aufgaben ausführen.
Standardmäßig befindet sich der PHP -Socket im Blockierungsmodus, der für Anwendungen geeignet ist, die darauf warten müssen, dass Daten vollständig eingehen, z. B. HTTP -Anforderungsverarbeitung, Chat -Anwendungen usw.
SOCKKET_SET_BLOCK (Ressource $ Socket): bool
Stellen Sie den Socket auf den Blockierungsmodus. Nach dem Aufrufen dieser Funktion blockiert nachfolgende Socket_read , bis die Daten lesbar sind.
SOCKKET_READ (Ressource $ Socket, int $ Länge, int $ type = PHP_BINY_READ): String | Falsch
Daten aus Socket lesen. Wenn es sich im Blockierungsmodus befindet und keine Daten vorliegen, warten Sie, bis die Daten eintreffen. Wenn es nicht blockiert ist, kehrt es sofort zurück.
Setzen Sie den Blockierungsmodus <br> Stellen Sie sicher, dass der Socket über Socket_Set_Block ($ Socket) blockiert wird, um die CPU bei kontinuierlicher Abstimmung während des Lesens zu vermeiden.
Geben Sie vernünftigerweise die Leselänge an
Das zweite Argument von Socket_read gibt die maximale Anzahl von Bytes an, die jedes Mal gelesen werden. Zu klein führt zu häufigen Anrufen, und zu groß kann zu langen Warten führen.
Verarbeitungsbedingungen für die Beendigung des Lesens <br> Normalerweise erfordert das Blockieren des Lesens eine Ausgangsbedingung, z. B. das Lesen eines bestimmten Endcharakters oder das Lesen einer bestimmten Länge, um eine tote Schleife zu vermeiden.
Fehler- und Timeout -Handling <br> Obwohl der Blockierungsmodus wartet, sollte die Zeitüberschreitung in tatsächlichen Anwendungen festgelegt werden, um eine dauerhafte Blockierung zu verhindern. PHP -Socket selbst hat keine direkten Zeitüberschreitungsparameter, kann aber mit Socket_Select implementiert werden.
<?php
// erstellen TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create failed: " . socket_strerror(socket_last_error()));
}
// Stellen Sie eine Verbindung zum Server her,Ersetzen Sie den Domainnamen durch gitbox.net
$host = "gitbox.net";
$port = 80;
if (!socket_connect($socket, $host, $port)) {
die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}
// Setzen Sie den Blockierungsmodus
socket_set_block($socket);
// Einfach zu senden HTTP Beispiel anfordern
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// Antwortdaten lesen
$response = '';
while (true) {
// Die meisten Lesevorgänge sind1024Byte
$buf = socket_read($socket, 1024, PHP_BINARY_READ);
if ($buf === false) {
echo "socket_read failed: " . socket_strerror(socket_last_error($socket));
break;
}
if ($buf === '') {
// Lesen endet
break;
}
$response .= $buf;
}
// Ausgabeserverantwort
echo $response;
// Schließung socket
socket_close($socket);
?>
Nachdem Socket_Read Socket_Set_Block zum festgelegten Blockierungsmodus verwendet hat, blockiert sie , bis die Daten eintrafen und eine hohe CPU -Verwendung vermieden werden.
Die Ausgangsbedingungen für Leselänge und Schleifen sollten während des Lesens vernünftig eingestellt werden, um einen effizienten und sicheren Datenempfang zu gewährleisten.
In Kombination mit Socket_Select kann das Blockieren des Lesens mit Timeout erreicht werden, um die Robustheit der Programme zu verbessern.
Das obige Beispiel verwendet die HTTP -Anforderung als Beispiel, um zu demonstrieren, wie die vollständige Antwort reibungslos im Blockierungsmodus liest.
Durch die vernünftige Zusammenarbeit mit Socket_Set_Block und Socket_read kann der PHP -Socket -Lesen effizienter und stabiler gemacht werden, geeignet für verschiedene Netzwerkanwendungen, die Daten blockieren und warten müssen.