Start · Sprachen · PHP · Referenz · swoole_timer_tick

swoole_timer_tick

Funktion

Löst eine Timer-Callback-Funktion wiederholt in einem festen Zeitintervall (in Millisekunden) aus und gibt die Timer-ID zurück.

Kategorie: misc

Signatur

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

Beschreibung

swoole_timer_tick() richtet einen wiederkehrenden Timer ein, der die angegebene Callback-Funktion in einem festen Intervall von $ms Millisekunden aufruft. Im Gegensatz zu swoole_timer_after(), das den Callback nur einmalig ausführt, wird der Callback bei swoole_timer_tick() so lange wiederholt, bis der Timer explizit über swoole_timer_clear() gestoppt wird.

Die Funktion ist Teil der Swoole-Erweiterung für asynchrones PHP und eignet sich hervorragend für periodisch wiederkehrende Aufgaben wie Heartbeat-Checks, regelmäßige Datenbankabfragen, Cache-Aktualisierungen oder das Versenden periodischer Statusmeldungen in einem laufenden Server-Prozess.

Der zurückgegebene Integer-Wert ist die eindeutige Timer-ID, mit der der Timer später über swoole_timer_clear() angehalten werden kann. Optional können zusätzliche Parameter $params übergeben werden, die direkt an den Callback weitergeleitet werden. Innerhalb des Callbacks kann der Timer auch durch Aufruf von swoole_timer_clear($timer_id) selbst gestoppt werden.

Hinweis: swoole_timer_tick() funktioniert nur innerhalb des Swoole-Ereignis-Loops (z. B. in einem Swoole\Server-, Swoole\Process- oder Swoole\Coroutine-Kontext). In einem normalen synchronen PHP-Skript hat die Funktion keine Wirkung.

Parameter

Name Typ Default Beschreibung
$ms Pflicht int Das Zeitintervall in Millisekunden, in dem der Callback wiederholt aufgerufen wird. Der Wert muss größer als 0 sein.
$callback Pflicht callable Die Callback-Funktion, die bei jedem Ablauf des Intervalls aufgerufen wird. Sie erhält als erstes Argument die Timer-ID (int $timer_id) und als weiteres Argument die optionalen $params.
$params mixed Beliebige zusätzliche Parameter, die an den Callback übergeben werden sollen. Werden als zweites (und weitere) Argument(e) an die Callback-Funktion weitergeleitet.

Rückgabewert

Typ
int
Beschreibung
Gibt die eindeutige Timer-ID als Integer zurück. Diese ID kann verwendet werden, um den Timer mit swoole_timer_clear() zu stoppen.

Beispiele

Einfacher wiederkehrender Timer alle 500 ms

<?php
// Swoole-Server-Kontext oder Swoole\Runtime::enableCoroutine() vorausgesetzt

Swoole\Timer::tick(500, function (int $timer_id) {
    echo "Timer {$timer_id} ausgelöst um: " . date('H:i:s') . PHP_EOL;
});

// Äquivalent mit der prozeduralen Funktion:
$timerId = swoole_timer_tick(500, function (int $timer_id) {
    echo "Timer {$timer_id} ausgelöst um: " . date('H:i:s') . PHP_EOL;
});

echo "Timer gestartet mit ID: {$timerId}" . PHP_EOL;
Timer gestartet mit ID: 1 Timer 1 ausgelöst um: 12:00:00 Timer 1 ausgelöst um: 12:00:00 Timer 1 ausgelöst um: 12:00:01 ...

Timer mit automatischer Selbst-Stoppt-Logik nach 5 Wiederholungen

<?php
// Innerhalb eines Swoole-Prozesses oder Coroutine-Kontexts

$count = 0;

$timerId = swoole_timer_tick(1000, function (int $timer_id) use (&$count) {
    $count++;
    echo "Durchlauf #{$count} um " . date('H:i:s') . PHP_EOL;

    if ($count >= 5) {
        swoole_timer_clear($timer_id);
        echo "Timer gestoppt nach {$count} Durchläufen." . PHP_EOL;
    }
});

echo "Timer ID: {$timerId} gestartet." . PHP_EOL;
Timer ID: 1 gestartet. Durchlauf #1 um 12:00:01 Durchlauf #2 um 12:00:02 Durchlauf #3 um 12:00:03 Durchlauf #4 um 12:00:04 Durchlauf #5 um 12:00:05 Timer gestoppt nach 5 Durchläufen.

Timer mit zusätzlichen Parametern

<?php
// Zusätzliche Daten an den Callback übergeben

$timerId = swoole_timer_tick(2000, function (int $timer_id, string $message, int $threshold) use (&$callCount) {
    $callCount++;
    echo "Nachricht: {$message} (Aufruf #{$callCount})" . PHP_EOL;

    if ($callCount >= $threshold) {
        swoole_timer_clear($timer_id);
        echo "Maximale Aufrufe ({$threshold}) erreicht, Timer gestoppt." . PHP_EOL;
    }
}, 'Heartbeat', 3);

echo "Timer mit ID {$timerId} gestartet." . PHP_EOL;
Timer mit ID 1 gestartet. Nachricht: Heartbeat (Aufruf #1) Nachricht: Heartbeat (Aufruf #2) Nachricht: Heartbeat (Aufruf #3) Maximale Aufrufe (3) erreicht, Timer gestoppt.

// Wichtig · Fallstricke

Nur im Swoole-Kontext: swoole_timer_tick() ist ausschließlich innerhalb des Swoole-Ereignis-Loops wirksam. In normalen synchronen PHP-Skripten ohne Swoole-Runtime hat der Aufruf keine Wirkung und es gibt keinen laufenden Prozess, der den Timer auslösen würde.

Ressourcenverwaltung: Timer, die nicht mehr benötigt werden, sollten unbedingt mit swoole_timer_clear() gestoppt werden, um Speicherlecks und unnötige CPU-Last zu vermeiden. Bei Server-Prozessen, die viele Timer erzeugen, kann eine fehlende Bereinigung zu Problemen führen.

OOP-Alternative: Ab neueren Swoole-Versionen wird die objektorientierte Schreibweise Swoole\Timer::tick() bevorzugt. Sie ist funktional identisch, aber konsistenter mit dem modernen Swoole-API-Stil.

Mindestintervall: Das Intervall sollte nicht zu klein gewählt werden (z. B. unter 1 ms), da dies zu hoher CPU-Last führen kann. Das tatsächliche Intervall kann je nach Systemauslastung leicht variieren.