Bei der Verwendung von PHP für die Netzwerkprogrammierung ist die Funktion stream_socket_recvfrom eine Funktion, die üblicherweise zum Empfangen von UDP -Paketen verwendet wird. Standardmäßig blockiert diese Funktion beim Warten auf Daten, bis Daten empfangen werden oder ein Fehler auftritt, was in einigen Szenarien langfristige Pausen des Programms verursachen kann, was die Leistung und die Benutzererfahrung beeinflusst. Um diese lange Blockierung zu vermeiden, müssen wir ein Lese -Timeout festlegen.
In diesem Artikel wird detailliert erklärt, wie ein Lese -Timeout in der Funktion stream_socket_recvfrom festgelegt wird, um das Verhalten des Programms besser zu steuern.
Die grundlegende Verwendung der Funktion von Stream_Socket_Recvfrom lautet wie folgt:
$data = stream_socket_recvfrom($socket, 1024);
Es wird bis zu 1024 Bytes von Daten aus dem angegebenen $ Socket gelesen. Wenn keine Daten eintreffen, blockiert und wartet die Funktionsblöcke.
Wenn Stream_Socket_Recvfrom aufgerufen wird, wird das Programm warten, wenn der Peer keine Daten sendet, das Programm wartet, was für die Reaktionsgeschwindigkeit und Stabilität von Netzwerkanwendungen sehr ungünstig ist. Um zu vermeiden, dass das Programm für lange Zeit stecken bleibt, müssen wir einen Zeitüberschreitungsmechanismus festlegen. Sobald die Zeitüberschreitung abgestimmt ist, werden wir das Lesen aufgeben und andere Verarbeitung durchführen.
In PHP wird das Operation Stream Timeout im Allgemeinen über die Funktion Stream_set_timeout implementiert. Diese Funktion kann eine Zeitüberschreitungszeit für einen geöffneten Stream festlegen.
Beispiel:
// erstellen UDP socket
$socket = stream_socket_server("udp://0.0.0.0:9999", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
die("无法erstellensocket: $errstr ($errno)\n");
}
// Timeout einstellen,Einheiten in Sekunden und Mikrosekunden
// 这里Timeout einstellen时间为 5 Zweite
stream_set_timeout($socket, 5);
// Aufrufen einer Lesefunktion
$data = stream_socket_recvfrom($socket, 1024);
$info = stream_get_meta_data($socket);
if ($info['timed_out']) {
echo "Datenauszeit lesen,Warten auf\n";
} else {
echo "Daten erhalten: $data\n";
}
stream_set_timeout ($ socket, 5) legt ein 5-Sekunden-Zeitüberschreitend fest.
Stellen Sie nach dem Lesen der Daten fest, ob das Timeout von stream_get_meta_data ($ socket) erreicht wird.
Zusätzlich zum Zeitüberschreitungsmechanismus besteht eine weitere übliche Praxis darin, den Socket auf den Nicht-Blockiermodus zu setzen und die Daten dann in Verbindung mit einem Umfrags- oder ereignisgesteuerten Mechanismus zu lesen.
// erstellen socket
$socket = stream_socket_server("udp://0.0.0.0:9999", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
die("无法erstellensocket: $errstr ($errno)\n");
}
// Setzen Sie den Nichtblockierungsmodus
stream_set_blocking($socket, false);
$startTime = time();
$timeout = 5; // Zweite
while (true) {
$data = stream_socket_recvfrom($socket, 1024);
if ($data !== false && $data !== '') {
echo "Daten erhalten: $data\n";
break;
}
if (time() - $startTime > $timeout) {
echo "Timeout lesen,Verlassen Sie die Schleife\n";
break;
}
// vermeidenCPUZu hohe Belegung,Angemessen schlafen
usleep(100000); // 100毫Zweite
}
Diese Methode ermöglicht eine flexiblere Kontrolle der Leselogik und erleichtert die Integration von Ereignisschleifen.
stream_socket_recvfrom blocks standardmäßig, was dazu führen kann, dass das Programm lange wartet.
Verwenden Sie Stream_Set_Timeout , um die Zeitüberschreitungszeit festzulegen, um zu lange zu verhindern.
Verwenden Sie nach dem Lesen stream_get_meta_data , um festzustellen, ob die Zeitüberschreitung erreicht ist.
Sie können auch den nicht blockierenden Modus verwenden, um die Lesedauer mit Umfragen zu steuern.
Ein vernünftiges Festlegen von Zeitüberschreitungsparametern ist der Schlüssel zur Gewährleistung einer stabilen Reaktion von Netzwerkprogrammen.