Signatur
Beschreibung
swoole_timer_after ist die prozedurale Variante von Swoole\Timer::after und ermöglicht es, eine Callback-Funktion genau einmal auszuführen, nachdem eine angegebene Zeitspanne (in Millisekunden) vergangen ist. Die Funktion arbeitet nicht-blockierend und integriert sich vollständig in die Swoole-Eventloop, sodass andere Aufgaben während der Wartezeit weiter verarbeitet werden können.
Typische Anwendungsfälle sind zeitverzögerte Aktionen wie das Senden von Willkommensnachrichten an neu verbundene Clients, das Implementieren von Timeouts für asynchrone Operationen oder das einmalige Ausführen von Aufräumarbeiten nach einem bestimmten Zeitraum. Im Gegensatz zu swoole_timer_tick, das wiederholt ausgelöst wird, läuft der Timer bei swoole_timer_after nur ein einziges Mal.
Die Funktion gibt eine Timer-ID zurück, mit der der Timer vor seiner Ausführung über swoole_timer_clear abgebrochen werden kann. Zusätzliche Parameter, die nach $callback übergeben werden, werden direkt an die Callback-Funktion weitergeleitet.
Wichtig: swoole_timer_after funktioniert nur innerhalb der Swoole-Eventloop, also z. B. innerhalb von Server-Event-Callbacks. In regulären PHP-Skripten ohne laufende Eventloop hat die Funktion keinen Effekt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $ms Pflicht | int | Verzögerung in Millisekunden, nach der der Callback ausgeführt wird. Muss größer als 0 sein. Zum Beispiel entspricht 1000 einer Verzögerung von einer Sekunde. |
|
| $callback Pflicht | callable | Die Callback-Funktion, die nach Ablauf der Verzögerung einmalig ausgeführt wird. Sie erhält als erstes Argument die Timer-ID sowie alle weiteren optionalen Parameter, die an swoole_timer_after übergeben wurden. |
|
| $params | mixed | Beliebige zusätzliche Parameter, die direkt an die Callback-Funktion weitergegeben werden. Nützlich, um Kontextdaten ohne Closures zu übergeben. |
Rückgabewert
swoole_timer_clear übergeben werden, um den Timer vor seiner Ausführung abzubrechen.Beispiele
Einfache zeitverzögerte Nachricht
<?php
// Innerhalb eines Swoole-Server-Callbacks
$server->on('connect', function ($server, $fd) {
// Nach 2 Sekunden eine Willkommensnachricht senden
swoole_timer_after(2000, function () use ($server, $fd) {
if ($server->exist($fd)) {
$server->send($fd, "Willkommen! Diese Nachricht erscheint 2 Sekunden nach der Verbindung.\n");
}
});
echo "Client $fd verbunden.\n";
});
Timer mit Timeout und vorzeitigem Abbruch
<?php
// Swoole HTTP-Server mit Timeout-Logik
$server = new Swoole\Http\Server('0.0.0.0', 9501);
$server->on('request', function ($request, $response) {
// Simulierter Timeout: Antwort nach 5 Sekunden erzwingen
$timerId = swoole_timer_after(5000, function () use ($response) {
$response->status(504);
$response->end('Timeout: Die Anfrage hat zu lange gedauert.');
}, 'timeout-kontext');
// Simuliere eine schnelle Verarbeitung
$ergebnis = 'Schnelle Antwort';
if ($ergebnis) {
// Timeout-Timer abbrechen, da Antwort rechtzeitig fertig ist
swoole_timer_clear($timerId);
$response->end($ergebnis);
}
});
$server->start();
Parameter an den Callback übergeben
<?php
// Innerhalb der Swoole-Eventloop
Swoole\Coroutine\run(function () {
$benutzerId = 42;
$aktion = 'logout';
swoole_timer_after(3000, function (int $timerId, int $uid, string $akt) {
echo "Timer $timerId ausgelöst: Benutzer $uid wird '$akt' durchgeführt.\n";
}, $benutzerId, $aktion);
// Warte, damit die Eventloop läuft
Swoole\Coroutine::sleep(4);
});
// Wichtig · Fallstricke
Nur innerhalb der Swoole-Eventloop: swoole_timer_after hat außerhalb einer laufenden Swoole-Eventloop keinen Effekt. Verwende die Funktion ausschließlich in Server-Callbacks, Coroutinen oder ähnlichen Swoole-Kontexten.
Genauigkeit: Die tatsächliche Auslösezeit kann leicht von der angegebenen Verzögerung abweichen, abhängig von der Last der Eventloop. Für hochpräzise Timing-Anforderungen ist Swoole nicht geeignet.
Ressourcen-Management: Wenn ein Timer nicht mehr benötigt wird (z. B. bei Verbindungsabbruch), sollte er mit swoole_timer_clear abgebrochen werden, um Speicherlecks und unerwartete Callback-Aufrufe auf bereits geschlossene Ressourcen zu vermeiden.
Deprecation: Die prozedurale Funktion swoole_timer_after ist ein Alias für Swoole\Timer::after. In modernen Swoole-Versionen wird die objektorientierte Schreibweise bevorzugt.