Bei hochpräzisen Aufgaben oder zeitempfindlichen PHP-Anwendungen werden gewöhnliche Schlafstörungen () oder us im Sleep () die Anforderungen an die Verzögerung der Nanosekundenverzögerung häufig nicht erfüllen. Sleep () kann nur Sekunden genau sein. Obwohl usleep () Mikrosekunden unterstützt, ist es aufgrund des Zeitplanungsmechanismus und der Systemgenauigkeitsbeschränkungen von PHP immer noch unmöglich, eine stabile Kontrolle zu erreichen.
Um dieses Problem zu lösen, bietet die Funktion Time_nanosleep () eine raffiniertere Methode zur Verzögerungskontrolle. In diesem Artikel wird vorgestellt, wie mikrotime (true) und time_nanoseep () kombiniert werden können, um eine präzise Verzögerungsregelung zu erreichen.
time_nanoseep () ist eine Funktion, die von PHP für die Verzögerung auf Nanosekundenebene bereitgestellt wird. Sein Funktionsprototyp ist wie folgt:
bool time_nanosleep(int $seconds, int $nanoseconds)
Sie können eine Kombination von "Sekunden" und "Nanosekunden" angeben, um das Skript auszuführen. Wenn Sie beispielsweise um 1,5 Millisekunden (d. H. 1500000 Nanosekunden) verzögern möchten, können Sie die folgende Methode verwenden:
time_nanosleep(0, 1500000);
Hinweis: Das Verhalten von time_nanoseep () wird weiterhin von der Genauigkeit der Systemaktuhren und der PHP -Implementierung beeinflusst, und die wahre Genauigkeit kann leicht voreingenommen sein. In den meisten Anwendungen ist es jedoch stabiler als usleep () .
Manchmal müssen wir nicht nur die feste Zeit verzögern, sondern auch sicherstellen, dass der Code innerhalb eines bestimmten Zeitraums von einem bestimmten Punkt bis zum Ende eines bestimmten Punktes genau gesteuert wird. Zu diesem Zeitpunkt ist Microtime (True) sehr nützlich, es gibt den Mikrosekundenzeitstempel seit der UNIX -Epoche mit höherer Genauigkeit zurück.
Das Folgende ist ein Beispiel für die Verzögerungssteuerung, die mit Time_nanoSeep () und microtime (True) -Kombination implementiert wird:
<?php
// Zielverzögerungszeit(In Sekunden)
$targetDelay = 0.005; // 5 Millisekunde
$start = microtime(true);
// Simulieren Sie bestimmte Operationen durchzuführen
for ($i = 0; $i < 1000; $i++) {
// Angenommen, dieser Zyklus verbraucht einige Zeit
}
// Berechnen Sie die verbrauchte Zeit
$elapsed = microtime(true) - $start;
// Zeit für zusätzliche Verzögerung erforderlich
$remainingDelay = $targetDelay - $elapsed;
if ($remainingDelay > 0) {
// Teilen Sie die verbleibende Zeit in Sekunden und Nanosekunden auf
$seconds = (int)$remainingDelay;
$nanoseconds = (int)(($remainingDelay - $seconds) * 1e9);
// Genaue Verzögerung
time_nanosleep($seconds, $nanoseconds);
}
// Gesamtzeit zeitaufwändig
$totalTime = microtime(true) - $start;
echo "Gesamtzeitverbrauch: " . round($totalTime * 1000, 3) . " Millisekunde\n";
Steuerungsintervalle im Echtzeit-Erwerbssystem steuern
Download-/Upload -Funktion von Tempo Limit Limit (z. B. die Häufigkeit des Zugriffs auf eine bestimmte URL einschränken)
Simulieren Sie die Verzögerungen bei Netzwerkverzögerungen beim Testen bestimmter Schnittstellenantwortverhalten
Zum Beispiel bei der Implementierung eines Tempolimits -API -Antragstellers:
<?php
$urls = [
"https://gitbox.net/api/data/1",
"https://gitbox.net/api/data/2",
"https://gitbox.net/api/data/3"
];
$interval = 0.2; // Jeder 200 Millisekunde请求一次
foreach ($urls as $url) {
$start = microtime(true);
// Simulationsanfrage
file_get_contents($url);
$elapsed = microtime(true) - $start;
$remaining = $interval - $elapsed;
if ($remaining > 0) {
time_nanosleep(0, (int)($remaining * 1e9));
}
}
Auf diese Weise können wir das Intervall zwischen jeder Anfrage genauer steuern, vermeiden, Druck auf den Zielserver auszuüben oder die rhythmischen Anforderungen unserer eigenen Anwendungen zu erfüllen.
time_nanoseep () ist in Echtzeit-Betriebssystemen keine "harte Echtzeit" und kann keine 100% ige Genauigkeit garantieren, aber es reicht für die Verwendung bei nicht kritischen Anlässen aus.
Einige Plattformen oder PHP -kompilierte Versionen unterstützen möglicherweise nicht time_nanoseep () . Es wird empfohlen, zu bestätigen, ob die Funktion vor der Verwendung verfügbar ist.
Wenn eine stabilere Timinggenauigkeit erforderlich ist, müssen möglicherweise andere Sprachen (wie c) oder Unterstützung auf Systemebene berücksichtigt werden.
Die Verwendung von time_nanoSeep () mit microtime (true) kann eine genauere Verzögerungsregelung erreichen als usleep () in PHP, was für Szenarien mit hohen Anforderungen an die Zeitregelung geeignet ist. Obwohl es durch Systemplanung und PHP -Implementierungsdetails immer noch begrenzt ist, bietet es in den meisten Anwendungen eine ausreichende Präzision und Flexibilität und ist ein wichtiges Instrument für die raffinierte Latenzkontrolle.