Start · Sprachen · PHP · Referenz · swoole_timer_after

swoole_timer_after

Funktion

Plant die einmalige Ausführung einer Callback-Funktion nach einer definierten Verzögerung in Millisekunden innerhalb der Swoole-Eventloop.

seit PHP 1.7.7 Kategorie: misc

Signatur

swoole_timer_after(int $ms, callable $callback, mixed ...$params): int

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

Typ
int
Beschreibung
Gibt eine ganzzahlige Timer-ID zurück, die den erzeugten Timer eindeutig identifiziert. Diese ID kann an 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);
});
Timer 1 ausgelöst: Benutzer 42 wird 'logout' durchgeführt.

// 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.