Sleep () und us im Sleep () sind die am häufigsten genannten Funktionen, wenn sie verzögerte Operationen in PHP ausführen. Time_nanosleeep () wird jedoch zu einem unverzichtbaren Werkzeug, wenn eine genauere Verzögerungsregelung erforderlich ist, insbesondere in der Nanosekunden -Präzision. In diesem Artikel wird die Nutzungsmethoden von Time_NanOSleep () , gemeinsamen Best Practices und der Vermeidung verwandter Sicherheits- und Leistungsfallen in der tatsächlichen Entwicklung ausführlich analysiert.
time_nanoSeep () ist eine Funktion, die von PHP bereitgestellt wird, die die Programmausführung für eine bestimmte Zeit mit der Genauigkeit von Sekunden und Nanosekunden pausieren kann. Der Funktionsprototyp lautet wie folgt:
bool time_nanosleep(int $seconds, int $nanoseconds)
$ Sekunden : Ganzzahl Sekunden.
$ nanosekunden : ganzzahlige nanosekunden (0 ~ 999.999.9999).
Return true bedeutet Erfolg.
Rückgabe falsch oder ein Ausnahme zeigt einen Fehler oder eine Unterbrechung an.
Es ist zu beachten, dass, wenn die Funktion während der Wartezeit durch das Systemsignal unterbrochen wird, ein Array mit der unvollendeten Zeit zurückgibt:
[
"seconds" => int,
"nanoseconds" => int
]
Der einfachste Weg, es zu verwenden, ist wie folgt:
<?php
echo "Warten Sie auf den Start...\n";
time_nanosleep(1, 500000000); // Pause 1.5 Zweite
echo "Warten Sie auf das Ende。\n";
Der obige Code macht das Programm 1,5 Sekunden lang bei und führt dann weiterhin nachfolgende Logik aus.
In der Produktionsumgebung kann Time_nanoSleep () aufgrund der Signalunterbrechung im Voraus zurückkehren. Hier ist eine sichere Möglichkeit, damit umzugehen:
<?php
$seconds = 2;
$nanoseconds = 0;
do {
$result = time_nanosleep($seconds, $nanoseconds);
if (is_array($result)) {
// Wenn unterbrochen,Aktualisieren Sie die verbleibende Zeit
$seconds = $result["seconds"];
$nanoseconds = $result["nanoseconds"];
echo "Durch Signal unterbrochen,Warten Sie noch einmal...\n";
}
} while (is_array($result));
echo "Verspätete Fertigstellung。\n";
Diese Schreibmethode stellt sicher, dass die Verzögerung vollständig ausgeführt wird, auch wenn sie auf halbem Weg unterbrochen wird.
Der Maximalwert des Parameters von Nanosekunden beträgt 999.999.999, was diesen Wert überschreitet, was zu einer Warnung führt:
Warning: time_nanosleep(): nanoseconds out of range
Die Lösung besteht darin, den überschüssigen Teil in Sekunden umzuwandeln:
$ns = 1_500_000_000; // Überschreiten 1 Zweite的纳Zweite数
$seconds = intdiv($ns, 1_000_000_000);
$nanoseconds = $ns % 1_000_000_000;
time_nanosleep($seconds, $nanoseconds);
Wenn Sie eine genaue Kontrolle über die Zeit benötigen, können Sie es in Kombination mit HRTime () verwenden:
$start = hrtime(true); // 纳Zweite计时器
time_nanosleep(0, 500000000); // Warten 0.5 Zweite
$end = hrtime(true);
$elapsed = ($end - $start) / 1e9;
echo "Tatsächliche zeitaufwändige: {$elapsed} Zweite\n";
Funktion | Genauigkeit | Ist es möglich zu unterbrechen? | Plattformunterstützung |
---|---|---|---|
schlafen() | Zweite | Ja | Plattformübergreifend |
usleep () | Mikrosekunde | NEIN | Windows <= PHP 5.3 unterstützt nicht |
time_nanosleeep () | Nanosekunden | Ja | Plattformübergreifend |
foreach ($requests as $request) {
call_api("https://gitbox.net/api/send", $request);
time_nanosleep(0, 250000000); // Jeder 250ms Eine Bitte
}
Bei Verwendung von Multi-Thread- oder Multi-Process-Operationen kann eine leichte Verzögerung hinzugefügt werden, um den Ressourcenwettbewerb zu vermeiden:
for ($i = 0; $i < 5; $i++) {
fork_process($i);
time_nanosleep(0, 100000000); // 100ms Verzögerung,Vermeiden Sie Konflikte
}
Zum Beispiel bei der CLI -Animation:
$frames = ['-', '\\', '|', '/'];
while (true) {
foreach ($frames as $frame) {
echo "\rLaden $frame";
time_nanosleep(0, 100000000); // 0.1 Zweite
}
}
Obwohl Time_nanosleep () bequem ist, kann es auch für Ressourcenblockierungsangriffe verwendet werden, wie z. B.:
// 恶意Verzögerung造成的服务阻断
time_nanosleep(10, 0);
Anregung:
Erlauben Sie den Benutzern nicht, Verzögerungsparameter zu steuern.
Verwenden Sie maximale Grenzwerte und Protokollverzögerungsprotokolle.
Mit Timeout und Watchdog -Mechanismus zusammenarbeiten, um den Kernprozess zu schützen.
time_nanoseep () ist ein leistungsstarkes Werkzeug, das eine Latenzkontrolle mit hoher Präzision bietet und bei einigen detaillierten Aufgaben besser geeignet ist als Schlaf () . Verwenden Sie es vernünftigerweise können das Programm flexibler und effizienter bei der Verzögerungsverarbeitung, gleichzeitiger Kontrolle und Drosselung. Übermäßiger oder unangemessener Gebrauch kann jedoch auch Probleme mit Leistungsabfällen und Sicherheit verursachen. Daher ist es die Fähigkeit, es vorsichtig und strategisch auf der Grundlage der Beherrschung seiner Prinzipien zu verwenden, die jeder PHP -Entwickler haben sollte.