Signatur
Beschreibung
swoole_timer_clear() beendet einen laufenden Timer, der mit swoole_timer_tick() (wiederholender Timer) oder swoole_timer_after() (einmaliger Timer) erstellt wurde. Der Timer wird anhand seiner eindeutigen Timer-ID identifiziert und vollständig aus dem Swoole-Event-Loop entfernt.
Diese Funktion ist essenziell, wenn ein Timer nicht mehr benötigt wird – etwa wenn eine Aufgabe vorzeitig abgeschlossen wurde, eine Verbindung getrennt wurde oder eine Ressource freigegeben werden soll. Ohne explizites Löschen läuft ein tick-Timer unbegrenzt weiter und verbraucht Ressourcen.
Die Funktion entspricht der Methode Swoole\Timer::clear() und kann sowohl im prozeduralen als auch im objektorientierten Stil verwendet werden. Sie gibt true zurück, wenn der Timer erfolgreich gelöscht wurde, und false, wenn die angegebene ID nicht existiert oder der Timer bereits abgelaufen ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $timer_id Pflicht | int | Die eindeutige ID des Timers, die von swoole_timer_tick() oder swoole_timer_after() zurückgegeben wurde. |
Rückgabewert
true zurück, wenn der Timer erfolgreich gestoppt und zerstört wurde. Gibt false zurück, wenn kein Timer mit der angegebenen ID gefunden wurde (z. B. weil er bereits abgelaufen oder nie erstellt wurde).Beispiele
Wiederholenden Timer nach einer bestimmten Zeit stoppen
<?php
// Erstellt einen Tick-Timer, der alle 500 ms feuert
$timerId = swoole_timer_tick(500, function () {
echo "Timer läuft..." . PHP_EOL;
});
// Nach 3 Sekunden den Timer stoppen
swoole_timer_after(3000, function () use ($timerId) {
$result = swoole_timer_clear($timerId);
if ($result) {
echo "Timer erfolgreich gestoppt." . PHP_EOL;
} else {
echo "Timer konnte nicht gestoppt werden." . PHP_EOL;
}
});
Timer bei Verbindungstrennung aufräumen
<?php
$server = new Swoole\Server('0.0.0.0', 9501);
// Speichert Timer-IDs pro Verbindung
$timers = [];
$server->on('connect', function (Swoole\Server $server, int $fd) use (&$timers) {
echo "Client verbunden: fd={$fd}" . PHP_EOL;
// Heartbeat-Timer für jede Verbindung starten
$timers[$fd] = swoole_timer_tick(1000, function () use ($fd) {
echo "Heartbeat für fd={$fd}" . PHP_EOL;
});
});
$server->on('close', function (Swoole\Server $server, int $fd) use (&$timers) {
echo "Client getrennt: fd={$fd}" . PHP_EOL;
// Timer beim Trennen der Verbindung aufräumen
if (isset($timers[$fd])) {
swoole_timer_clear($timers[$fd]);
unset($timers[$fd]);
echo "Heartbeat-Timer für fd={$fd} gestoppt." . PHP_EOL;
}
});
$server->on('receive', function () {});
$server->start();
// Wichtig · Fallstricke
Achtung: swoole_timer_clear() kann nur innerhalb des Swoole-Event-Loops aufgerufen werden (z. B. in Callbacks von on('WorkerStart'), Timer-Callbacks oder Coroutinen). Ein Aufruf außerhalb des Event-Loops hat keine Wirkung.
Bei einmaligen Timern, die mit swoole_timer_after() erstellt wurden, ist es möglich, dass der Timer bereits ausgeführt wurde, bevor swoole_timer_clear() aufgerufen wird. In diesem Fall gibt die Funktion false zurück, was kein Fehler ist.
Nicht gelöschte Tick-Timer können zu Speicherlecks oder unerwünschten Seiteneffekten führen, wenn die zugehörige Ressource (z. B. eine Verbindung) bereits freigegeben wurde. Es empfiehlt sich, Timer-IDs zu verwalten und bei Cleanup-Operationen stets aufzuräumen.