Time_nanosleep () ist eine gemeinsame Werkzeugfunktion, mit der Entwickler das Programm für einen bestimmten Zeitraum in Sekunden und Nanosekunden "schlafen" können. Obwohl es theoretisch Nanosekundenverzögerungen im tatsächlichen Gebrauch unterstützt, wird seine Genauigkeit häufig durch den Planungsmechanismus des Betriebssystems, die Implementierung von PHP selbst und die Genauigkeit der Hardware -Uhr begrenzt. Dies bedeutet, dass das System selbst bei einer Verzögerung von 100 Mikrosekunde auch in Millisekunden mehr verzögert wird.
Wenn Sie eine Anwendung erstellen, die sehr zeitkritisch ist, z. B. einen Hochfrequenzhandelssimulator, die Datenerfassungssynchronisationsmechanismus oder eine Echtzeit-Kontrolllogik, ist die "unzuverlässige" Time_nanosleep () besonders tödlich. Was sollen wir also tun, wenn Time_nanosleep () nicht genau genug ist? In diesem Artikel werden mehrere zuverlässigere Alternativen eingeführt.
Obwohl usleep () die absolute Genauigkeit in einigen Systemen nicht garantieren kann, ist seine Stabilität besser als time_nanosleep () .
usleep(100); // Verzögerung100Mikrosekunde
HINWEIS : Usleep () akzeptiert Mikrosekunden anstelle von Nanosekunden (1 Sekunde = 1000000 Mikrosekunden), sodass die Nanosekundenverzögerung nicht direkt implementiert werden kann. In den meisten Geschäftsszenarien sind Mikrosekunden jedoch ausreichend.
Wenn Sie eine Nanosekundenstufe benötigen, kann dies durch CPU -Beschäftigung erreicht werden. Diese Methode besteht darin, die Zeit mit hoher Präzision kontinuierlich zu lesen, bis ein vorgegebenes Intervall erreicht ist, aber viel CPU verbraucht und für Produktionsumgebungen nicht geeignet ist.
function nano_sleep_busy($nanoseconds) {
$start = hrtime(true);
$end = $start + $nanoseconds;
while (hrtime(true) < $end);
}
nano_sleep_busy(50000); // Verzögerung50Mikrosekunde
HRTime (True) gibt den aktuellen Nanosekunden -Zeitstempel zurück, der für eine genaue Kontrolle der Zeitintervalle geeignet ist.
Bei Systemen mit extremen Anforderungen können die eigenen Funktionen von PHP nicht ausreichend sein. Zu diesem Zeitpunkt können Sie CLI-Tools oder in C/C ++ geschriebene Befehle auf Systemebene aufrufen, um die Verzögerung der hohen Präzision zu vervollständigen.
Rufen Sie beispielsweise ein kompiliertes ausführbares Programm auf (vorausgesetzt, Sie haben bereits ein Sleep_ns -Tool):
exec('/usr/local/bin/sleep_ns 50000'); // Verzögerung50Mikrosekunde
Sie können dieses Tool auch auf einen Server platzieren, den Sie steuern, z. B.:
file_get_contents("https://gitbox.net/tools/sleep_ns?duration=50000");
Auf diese Weise kann die Kontrolllogik an eine angemessenere Sprache zur Ausführung weitergegeben werden.
Wenn Ihre PHP-Umgebung Smoole unterstützt oder den ReactPHP/Ereignisschleifungsmechanismus verwendet, können Sie durch asynchrone nicht blockierende Methoden eine hohe Präzisionsverzögerungsregelung durchführen.
Swoole\Timer::after(0.05, function () {
echo "50Mikrosekunde后执行\n";
});
Obwohl die zugrunde liegende Ebene immer noch auf System -Timern beruht, da SWOOLE in C geschrieben ist und die Ausführungsmaschine von PHP umgeht, sind sowohl Präzision als auch Leistung besser als native Funktionen.
Verfahren | Mindestverzögerung Granularität | Genauigkeit | Ob es blockiert ist | Vorgeschlagene Verwendung |
---|---|---|---|---|
Time_nanosleep | Nanosekunden | Niedrig | Ja | Normales Verzögerungsszenario |
usep | Mikrosekunde | Medium | Ja | Verzögerung <1 Sekunde |
beschäftigt wartet + hrtime | Nanosekunden | hoch | Ja (hohe CPU) | Anforderungen an extreme Genauigkeit |
Externe Werkzeuge | Hängt von der Implementierung ab | hoch | Steuerbar | In das System integrieren |
SWOOLE/REACTPHP | Mikrosekunde | hoch | NEIN | Hohe Szenarien mit Parallelität/Coroutine |
In den meisten Szenarien ist die Kombination von Usleep () und HRTime () bereits sehr praktisch. Und wenn Sie eine Hochleistungsanwendung erstellen, die extrem latenzempfindlich ist, wird empfohlen, ein asynchrones Framework (z. B. SWOOLE) zu verwenden oder zu einer geeigneteren zugrunde liegenden Sprache zu wechseln, um einige der Funktionen zu implementieren.
Denken Sie daran: PHP ist keine Sprache für die Kontrolle von Echtzeit. Nur durch die Auswahl technischer Grenzen können Sie ein zuverlässiges und effizientes Programm schreiben.