Wie kann man in PHP wirklich präzise, kurze Pausen realisieren? Wer mit Mikrosekunden arbeiten muss – etwa beim Throttling von Anfragen, in Hardware-nahen Scripten oder bei der Simulation von Wartezeiten - stößt schnell auf die Funktion usleep(). Sie erlaubt es, die Skriptausführung punktgenau um winzige Zeitspannen zu verzögern. Klingt einfach - doch in der Praxis gibt es zahlreiche Details, die Sie kennen sollten, um Fehler und Performanceprobleme zu vermeiden.

Was ist usleep() und wofür wird es verwendet?
Die Funktion usleep() verzögert ein PHP-Skript um eine genaue Anzahl von Mikrosekunden. Eine Mikrosekunde ist der millionste Teil einer Sekunde. Im Gegensatz zu sleep() nutzt du usleep() für sehr kurze und präzise Pausen. Während sleep() nur volle Sekunden akzeptiert, steuerst du mit usleep() auch winzige Zeitspannen gezielt.
Typische Einsatzbereiche:
-
Rate Limiting: Sie wollen eine API nicht zu häufig ansprechen? Mit usleep() setzen Sie millisekundengenaue Wartezeiten zwischen Requests.
-
Kurze Pausen in Schleifen: Sie arbeiten eine Liste von Aufgaben ab und möchten zwischen den Schritten minimal pausieren, um die Serverlast oder das Verhalten zu steuern.
-
Simulationen und Tests: Sie simulieren verzögerte Prozesse oder testen UI-Reaktionen auf künstliche Latenzen.
Warum Mikrosekunden statt Sekunden?
Für viele Aufgaben reichen Sekunden-Pausen nicht aus. Mikrosekunden sind sinnvoll, wenn Sie etwa 10, 100 oder 250 Millisekunden (0,01 bis 0,25 Sekunden) pausieren möchten.
PHP usleep() – Syntax und Parameter
Die richtige Anwendung von usleep() beginnt mit einem Verständnis der Syntax und der erwarteten Werte.
Syntax:
void usleep(int $microseconds)
- $microseconds: Ein Integer-Wert, der die Anzahl der Mikrosekunden angibt, die das Script „schlafen“ soll. 1.000.000 Mikrosekunden entsprechen genau einer Sekunde.
Wichtige Hinweise zur Verwendung:
-
Werte über 1.000.000 (also länger als eine Sekunde) sind zwar erlaubt, aber betriebssystemabhängig: Manche Systeme, vor allem ältere Windows-Versionen, ignorieren große Werte oder begrenzen sie intern. Für längere Pausen empfiehlt sich daher die Funktion sleep().
-
Negative Werte: Wenn Sie eine negative Zahl übergeben, erzeugt PHP eine Fehlermeldung.
-
Rückgabewert: usleep() gibt keinen Wert zurück (Rückgabewert ist void). Im Unterschied dazu liefert sleep() bei Signal-Unterbrechungen oder Fehlern eine Zahl zurück (Restzeit).
Einfache usleep() Beispiele
Ein praktisches Beispiel verdeutlicht am schnellsten, wie usleep() funktioniert.
Beispiel 1: Grundlegende Verzögerung
$start = microtime(true);
usleep(500000);
/* 500.000 Mikrosekunden = 0,5 Sekunden */
$end = microtime(true);
echo 'Verstrichene Zeit: ' . round($end - $start, 3) . ' Sekunden';
Erklärung:
Sie messen die Zeit vor und nach dem Aufruf von usleep(). Bei einer Verzögerung von 500.000 Mikrosekunden erwarten Sie ungefähr 0,5 Sekunden Differenz – systemabhängige Schwankungen können auftreten.
Beispiel 2: usleep() in einer Schleife
for ($i = 1; $i <= 5; $i++) {
echo "Schritt $in";
usleep(200000);
/* 0,2 Sekunden Pause pro Durchlauf */
}
Typischer Anwendungsfall:
Diese Technik findet sich oft bei Polling-Schleifen, wenn Ressourcen regelmäßig überprüft oder Aufgaben sequenziell abgearbeitet werden und Sie die CPU-Last gering halten möchten.
Fortgeschrittene Anwendung und wichtige Überlegungen
Wer Wert auf präzise Zeitsteuerung legt, sollte die Unterschiede der PHP-Funktionen genau kennen.
usleep() vs. sleep() vs. time_nanosleep(): Der detaillierte Vergleich
Funktion | Einheit | Genauigkeit | Rückgabewert | Eignung für |
sleep() | Sekunden | niedrig | Restzeit/false | Lange Pausen |
usleep() | Mikrosekunden | mittel–hoch | void | Kurze Pausen |
time_nanosleep() | Sekunden + Nanosek. | sehr hoch | bool/Restzeit | Sehr präzise Pausen |
Hinweis:
usleep() eignet sich für Pausen < 1 Sekunde.
sleep() wird für ganze Sekunden verwendet.
time_nanosleep() ist am präzisesten, benötigt aber mehr Code und wird selten wirklich gebraucht.
CPU-Last:
Ältere PHP-Versionen oder bestimmte Betriebssysteme führen usleep() manchmal als „aktiven Wait“ aus – das bedeutet, der Prozess bleibt aktiv und belastet die CPU, statt sich wirklich schlafen zu legen. Moderne Umgebungen sind meist effizienter, aber in performancekritischen Fällen sollten Sie das Verhalten testen.
Genauigkeit und Systemabhängigkeiten
Die tatsächlich pausierte Zeit kann von der gewünschten Dauer abweichen – je nach System, Auslastung und Timer-Granularität. Sehr kleine Werte (< 1000 Mikrosekunden) führen unter Umständen zu gar keiner spürbaren Verzögerung, da viele Betriebssysteme Timer-Events in Intervallen abarbeiten.
- Windows-Unterstützung: Seit PHP 5.0.0 auf Windows verfügbar, davor nicht.
- Negative Werte: Führen zu einem Warning.
Praxis-Tipp:
Testen Sie die tatsächliche Dauer Ihrer Pausen immer mit microtime(true) vor und nach dem Aufruf.
Maximale Ausführungszeit (max_execution_time)
Wenn Ihr Script durch usleep() verzögert wird, zählt diese Pause zur maximalen Ausführungszeit (max_execution_time). Wird diese überschritten, bricht PHP das Script ab, auch wenn es nur „geschlafen“ hat.
- set_time_limit(): Sie können mit dieser Funktion die maximale Scriptlaufzeit anpassen. Aber: Während usleep() pausiert, kann PHP keine Kontrollmaßnahmen ausführen. Ein zu knapp gesetztes Limit führt zu einem Timeout.
usleep() und Output Buffering
Ein häufiger Fehler: Sie erwarten, dass Ausgaben nach echo und usleep() sofort erscheinen – in Wahrheit puffert PHP viele Ausgaben bis zum Ende des Scripts.
Lösung:
Verwenden Sie flush() und (sofern Output Buffering aktiv ist) ob_flush():
echo "Start...<br>";
ob_flush();
flush();
usleep(500000);
/* 0,5 Sekunden */
echo "Fertig.<br>";
ob_flush();
flush();
Wirkung:
Die Ausgaben erscheinen direkt im Browser, nicht erst nach Scriptende, was bei vielen Websites von Vorteil ist.
Signal Handling (für Experten)
Wie sleep(), kann usleep() theoretisch durch Signale unterbrochen werden – relevant für CLI-Scripte mit Signalbehandlung (etwa für Stop/Continue). usleep() gibt aber keine Information zurück, ob eine Unterbrechung erfolgte.
Praktische Anwendungsfälle für usleep()
-
Rate Limiting für API-Anfragen
Vermeiden Sie, dass Ihr Script zu viele Anfragen pro Sekunde sendet – zum Beispiel beim Scraping oder bei der Nutzung von externen APIs.
-
Polling-Mechanismen
Sie überwachen einen Wert in der Datenbank oder auf der Festplatte und legen mit usleep() kleine Pausen zwischen die Checks.
-
Simulation von langsamen Operationen im Skript
Beim Testen von UIs kann es helfen, künstliche Verzögerungen einzubauen, um z. B. Ladeindikatoren zu simulieren.
-
Hardware-nahe Programmierung
Wer mit Raspberry Pi und PHP-GPIO arbeitet, erzeugt mit usleep() sehr kurze Steuersignale.
-
Reduzierung von CPU-Last
In intensiven Schleifen sorgt ein kurzes usleep() dafür, dass das System Zeit für andere Aufgaben bekommt.
Häufige Fehler und Fallstricke (Troubleshooting)
-
Mikrosekunden und Millisekunden verwechseln
Wer 1000 Mikrosekunden eingibt, erhält nur 0,001 Sekunden Pause – nicht eine ganze Sekunde.
-
usleep() für zu lange Pausen verwenden
Ab ca. 1 Sekunde (1.000.000 Mikrosekunden) besser auf sleep() umsteigen.
-
Absolut exakte Pausen erwarten
Rechnen Sie mit leichten Schwankungen, insbesondere auf ausgelasteten Systemen, während Sie die Zeit in Sekunden messen.
-
Hohe CPU-Last
Bei auffällig hoher CPU-Last während Pausen: Testen Sie Alternativen und vergleichen Sie das Verhalten.
-
Ausgaben erscheinen nicht sofort
Nutzen Sie flush(), wenn die Ausgabe direkt im Browser sichtbar sein soll.
Fazit und Best Practices
usleep() ist die richtige Wahl, wenn Sie im Millisekundenbereich exakte Pausen brauchen - etwa für APIs, Hardware-Steuerung oder Performance-Optimierung in Schleifen.
Achten Sie darauf, dass usleep() betriebssystemabhängig minimal anders funktionieren kann. Für längere Pausen (> 1 Sekunde) ist sleep() besser geeignet.
Vermeiden Sie Fehler durch falsche Einheiten und testen Sie im Zweifel immer das Verhalten auf Ihrem Zielsystem. Vergessen Sie nicht, flush() zu nutzen, falls Sie sofortige Ausgaben erwarten. In Summe bleibt: Wer Präzision und kurze Pausen braucht, greift zu usleep(), sollte sich aber der kleinen Hürden bewusst sein – und, wie so oft in PHP, die Umgebung im Blick behalten.
FAQ zu PHP usleep()
Kann ich usleep(0) verwenden?
Ja, technisch möglich – es bewirkt aber praktisch nichts, außer dass ggf. der Scheduler andere Prozesse bevorzugt behandelt.
Läuft usleep() überall?
Ja, seit PHP 5.0.0 auch unter Windows, frühere Versionen hatten diese Funktion dort nicht.
Wie messe ich die echte Pause?
Mit microtime(true) vor und nach dem Aufruf.
Verwandte Funktionen
- sleep() – Ganze Sekunden pausieren, indem Sie die Funktion php sleep verwenden.
- time_nanosleep() – Sekunde + Nanosekunden
- time_sleep_until() – Bis zu einem Zeitstempel pausieren
- set_time_limit() – Maximale Skriptlaufzeit festlegen