Start · Sprachen · PHP · Referenz · swoole_timer_clear

swoole_timer_clear

Funktion

Stoppt und zerstört einen zuvor erstellten Swoole-Timer anhand seiner ID.

seit PHP 1.7.0 Kategorie: misc

Signatur

swoole_timer_clear(int $timer_id): bool

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

Typ
bool
Beschreibung
Gibt 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 läuft... Timer läuft... Timer läuft... Timer läuft... Timer läuft... Timer läuft... Timer erfolgreich gestoppt.

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.