In PHP ist Time_nanosleeep eine Funktion für eine präzise Steuerung von Verzögerungen, mit der Entwickler die Programmausführung in Sekunden und Nanosekunden pausieren können. Es bietet eine höhere zeitliche Auflösung als Schlaf oder US -Sleep . Entwickler treten jedoch häufig auf Probleme auf, die sie "bei Verwendung time_nanosleep nicht zu funktionieren scheint". In diesem Artikel werden mögliche Gründe und Debugging -Methoden erörtert.
<?php
echo "Start...\n";
time_nanosleep(0, 500000000); // Pause0.5Zweite
echo "Beenden...\n";
?>
In diesem Beispiel sollte das Programm nach Ausgabe von "Start ..." 0,5 Sekunden lang innehalten und dann "Ende ..." ausgeben.
Wenn Sie versuchen, sehr kurze Verzögerungen (z. B. 100 Millisekunden oder weniger) zu verwenden, ist es schwierig, den Verzögerungseffekt aus dem Anschluss- oder Browserausgang zu erkennen. Zum Beispiel:
time_nanosleep(0, 100000); // 0.1毫Zweite
Die Verzögerung ist zu diesem Zeitpunkt sehr kurz, und wenn Sie die Ausführungszeit in einer Schleife oder leistungsempfindlichen Umgebung nicht zählen, ist die Verzögerung fast unmöglich zu erkennen.
Wenn Sie Time_nanosleeep auf einer Webseite verwenden, zeigt der Browser die Zwischenausgabe auf der Serverseite nicht sofort an. Das heißt, auch wenn Sie auf der Serverseite 0,5 Sekunden lang innehalten, kann der Browser den Inhalt erst angezeigt, wenn die gesamte Seite das Rendern beendet hat.
Die Lösung besteht darin, eine Puffersteuerungsfunktion zu verwenden, z. B.:
ob_flush();
flush();
time_nanosleep(0, 500000000);
echo "Weiter ausführen";
Es ist jedoch zu beachten, dass die Einstellungen für den Ausgangspuffer des Webservers (z. B. Nginx oder Apache) selbst auch den Effekt beeinflussen.
Nicht alle Betriebssysteme und PHP -Kompilierungsumgebungen können eine präzise Latenz für Nanosekunden unterstützen. Auf einigen Plattformen kann Time_nanosleep zu einer ungefähren Implementierung abgebaut werden, wobei die tatsächliche Verzögerung vom erwarteten Wert voreingenommen werden kann. Sie können HRTime (TRUE) verwenden, um die tatsächliche Verzögerung zu überprüfen:
$start = hrtime(true);
time_nanosleep(0, 500000000);
$end = hrtime(true);
echo "Zeitverzögerung: " . ($end - $start) / 1e6 . " 毫Zweite";
Wenn der Ausgang viel größer als 500 Millisekunden ist, kann dies bedeuten, dass die Systemebene keine genaue Verzögerung unterstützt.
Wenn Ihr PHP -Skript während der Laufzeit unterbrochen wird (z. B. Benutzerabbruch, Timeout -Einstellung, Blunt exit () ), hat Time_Nanosleep möglicherweise keine Chance, die Ausführung zu vervollständigen. Sie können testen, indem Sie ignore_user_abort (wahr) einstellen;:
ignore_user_abort(true);
time_nanosleep(1, 0);
HRTime () bietet einen Zeitstempel auf Nanosekundenebene, der ideal zur Überprüfung ist, dass Verzögerungen wirksam sind.
Die Ausgabe in der Befehlszeilenumgebung ist in Echtzeit, sodass das Verhalten von Time_Nanosleep leichter beobachtet wird.
php test_sleep.php
Einlegen Sie Protokollierungspunkte in das Programm:
file_put_contents('/var/log/sleep.log', date('H:i:s') . " before\n", FILE_APPEND);
time_nanosleep(0, 500000000);
file_put_contents('/var/log/sleep.log', date('H:i:s') . " after\n", FILE_APPEND);
Das Beobachten des Zeitunterschieds zwischen den beiden Protokollen kann effektiv bestimmen, ob die Verzögerung wirksam ist.
Wenn Sie Time_nanosleeep in einer Hochfrequenzschleife verwenden, können Sie das obere oder HTOP -Tool verwenden, um festzustellen, ob die CPU -Verwendung verringert ist, um festzustellen, ob die Pause tatsächlich aufgetreten ist.
Angenommen, Sie senden mehrere Anfragen an https://gitbox.net/api/ping , und Sie müssen zwischen jeder Anfrage für 0,25 Sekunden pausieren:
for ($i = 0; $i < 5; $i++) {
file_get_contents("https://gitbox.net/api/ping");
echo "1. $i Die Anfrage wurde abgeschlossen gesendet\n";
time_nanosleep(0, 250000000); // 250毫Zweite
}
Wenn Sie CLI und HRTime () kombinieren, können Sie den Verzögerungseffekt genauer überprüfen.
time_nanosleeep ist eine praktische, aber missverstandene Verzögerungsfunktion in PHP. Es ist nicht ungültig, es ist einfach durch Plattformunterstützung, Ausführungsumgebung und Ausgangspuffermechanismus begrenzt. Das Verständnis dieser Unterschiede und Kombination von Debugging -Techniken kann Time_nanosleep effektiv verwenden, um eine genauere Verzögerungsregelung zu erreichen.