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