sleep()
Dieser Artikel erklärt die PHP-Funktion sleep(), ihre Syntax, Rückgabewerte und typische Anwendungsfälle wie Polling und Rate-Limiting.
Die PHP-Funktion sleep() pausiert die Ausführung Ihres Skripts für eine festgelegte Anzahl von ganzen Sekunden. Dieser Artikel erklärt die Syntax und Rückgabewerte, wann eine Verzögerung im Skript sinnvoll ist, Fallstricke beim Blockieren und bei Signalen sowie den Vergleich von sleep() mit seinen sub-sekunden-genauen Verwandten.
Syntax
sleep(int $seconds): int|false$seconds— die Anzahl der ganzen Sekunden, um die das Skript angehalten wird. Es muss eine nicht-negative ganze Zahl sein; ein negativer Wert löst einen Fehler aus.- Rückgabewert —
sleep()gibt bei Erfolg0zurück. Wird der Aufruf durch ein Signal unterbrochen (z. B. durch einen Alarm oder einenCtrl+C-Handler auf der CLI), gibt die Funktion die verbleibende Anzahl an Sekunden zurück, also eine positive ganze Zahl ungleich null. Sie gibtfalsenur zurück, wenn der Aufruf vollständig fehlschlägt.
Da sleep() nur ganze Zahlen akzeptiert, beträgt die kürzeste erzielbare Verzögerung eine Sekunde. Für feinere Kontrolle verwenden Sie usleep() (Mikrosekunden) oder time_nanosleep() (Nanosekunden).
Grundlegende Verwendung
Rufen Sie sleep() auf und übergeben Sie die Anzahl der Sekunden, die Sie warten möchten. Alles nach dem Aufruf wird erst ausgeführt, wenn die Verzögerung abgelaufen ist:
Das Skript gibt die erste Meldung aus, blockiert für fünf Sekunden und gibt dann die zweite aus. Die Pause ist deutlich sichtbar, wenn Sie das Skript mit einer Zeitnahme versehen:
<?php
$start = microtime(true);
sleep(2);
$elapsed = microtime(true) - $start;
echo "Waited about " . round($elapsed, 1) . " seconds\n";
?>Dies gibt Waited about 2 seconds aus und bestätigt damit die Pause. (Siehe microtime() zum Messen vergangener Zeit.)
Wann verwendet man sleep()?
sleep() ist am nützlichsten in Kommandozeilen- und Hintergrundskripten, bei denen eine kurze Pause beabsichtigt ist:
- Polling mit Verzögerung — Überprüfung einer Warteschlange, einer Datei oder einer API in regelmäßigen Abständen, anstatt in einer engen, CPU-intensiven Schleife.
- Rate-Limiting / rücksichtsvoller API-Zugriff — Anfragen so staffeln, dass ein Drittanbieter-Ratenlimit nicht überschritten wird.
- Retry-Back-off — Warten vor dem erneuten Versuch einer fehlgeschlagenen Operation, oft mit zunehmender Verzögerung.
Hier ist ein einfaches Retry-mit-Back-off-Muster:
<?php
$maxRetries = 3;
for ($attempt = 1; $attempt <= $maxRetries; $attempt++) {
$ok = ($attempt === 3); // pretend it succeeds on the 3rd try
if ($ok) {
echo "Succeeded on attempt $attempt\n";
break;
}
echo "Attempt $attempt failed, retrying...\n";
sleep($attempt); // back off longer each time: 1s, then 2s
}
?>Dies gibt zwei „failed"-Meldungen aus (mit 1 s und dann 2 s Wartezeit) und schließlich Succeeded on attempt 3.
sleep() blockiert den gesamten Prozess
sleep() ist ein blockierender Aufruf: Während des Wartens passiert nichts anderes in diesem PHP-Prozess. Das hat zwei wichtige Konsequenzen:
- Rufen Sie
sleep()niemals in einer normalen Web-Anfrage auf. Eine schlafende Anfrage hält einen PHP-FPM-Worker (und oft eine Browser-Verbindung) beschäftigt, ohne etwas zu tun. Das beeinträchtigt den Durchsatz und kann Request-Timeout-Limits auslösen. Pausen gehören in CLI-Skripte, Cron-Jobs und Queue-Worker. - Die Funktion gibt nicht an anderen Code ab. Wenn Sie warten müssen, ohne zu blockieren, ist dafür eine Event-Loop oder eine asynchrone Runtime zuständig, nicht
sleep().
Unterbrochene Sleeps behandeln
Auf der CLI kann ein Signal einen Sleep vorzeitig beenden. In diesem Fall gibt sleep() die noch verbleibenden Sekunden anstelle von 0 zurück, sodass Sie das Warten bei Bedarf fortsetzen können:
<?php
$remaining = sleep(5);
if ($remaining > 0) {
echo "Interrupted with $remaining seconds left\n";
} else {
echo "Slept the full duration\n";
}
?>Wenn der Sleep normal endet, ist $remaining gleich 0 und das Skript gibt Slept the full duration aus.
Sub-sekunden-Verzögerungen: usleep() und Alternativen
Da sleep() nur ganze Sekunden akzeptiert, bietet PHP präzisere Alternativen:
| Funktion | Einheit | Verwenden, wenn… |
|---|---|---|
sleep() | Sekunden | eine ganzsekündige Pause ausreicht |
usleep() | Mikrosekunden (1/1.000.000 s) | sub-sekunden-genaue Präzision benötigt wird |
time_nanosleep() | Sekunden + Nanosekunden | sehr feine Kontrolle benötigt wird |
time_sleep_until() | ein Ziel-Zeitstempel | zu einem bestimmten Zeitpunkt aufgewacht werden soll |
Um beispielsweise eine Schleife auf ungefähr 10 Iterationen pro Sekunde zu drosseln, pausieren Sie in jedem Durchlauf 100.000 Mikrosekunden (ein Zehntel Sekunde):
<?php
$interval = 1000000 / 10; // microseconds per iteration -> 100000
for ($i = 1; $i <= 3; $i++) {
echo "Tick $i\n";
usleep((int) $interval);
}
?>Dies gibt Tick 1, Tick 2, Tick 3 mit etwa einem Zehntel Sekunde Abstand zwischen den Zeilen aus.
Fazit
sleep() ist eine zuverlässige Möglichkeit, ein PHP-Skript für eine ganze Anzahl von Sekunden zu pausieren. Denken Sie daran, dass die Funktion den gesamten Prozess blockiert — verwenden Sie sie daher nicht in Live-Web-Anfragen, sondern reservieren Sie sie für CLI-Tools, Cron-Jobs und Worker — typischerweise für Polling, Rate-Limiting und Retry-Back-off. Wenn Sie eine feinere Zeitsteuerung benötigen, greifen Sie auf usleep(), time_nanosleep() oder time_sleep_until() zurück. Weitere Informationen zur Arbeit mit Zeit in PHP finden Sie unter PHP Date and Time.