W3docs

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ückgabewertsleep() gibt bei Erfolg 0 zurück. Wird der Aufruf durch ein Signal unterbrochen (z. B. durch einen Alarm oder einen Ctrl+C-Handler auf der CLI), gibt die Funktion die verbleibende Anzahl an Sekunden zurück, also eine positive ganze Zahl ungleich null. Sie gibt false nur 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:

php— editable, runs on the server

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:

FunktionEinheitVerwenden, wenn…
sleep()Sekundeneine ganzsekündige Pause ausreicht
usleep()Mikrosekunden (1/1.000.000 s)sub-sekunden-genaue Präzision benötigt wird
time_nanosleep()Sekunden + Nanosekundensehr feine Kontrolle benötigt wird
time_sleep_until()ein Ziel-Zeitstempelzu 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.

Übungen

Übung
Was ist die Funktion von 'sleep()' in PHP?
Was ist die Funktion von 'sleep()' in PHP?
Was this page helpful?