Start · Sprachen · PHP · Referenz · swoole_event_defer

swoole_event_defer

Funktion

Fügt eine Callback-Funktion hinzu, die beim nächsten Durchlauf des Event-Loops ausgeführt wird.

Kategorie: misc

Signatur

swoole_event_defer(callable $callback): bool

Beschreibung

swoole_event_defer() plant die Ausführung einer Callback-Funktion für den nächsten Durchlauf des Swoole-Event-Loops. Die Funktion kehrt sofort zurück, ohne auf die Ausführung des Callbacks zu warten. Der übergebene Callback wird erst ausgeführt, nachdem alle aktuell ausstehenden I/O-Ereignisse abgearbeitet wurden.

Dies ist nützlich, um Aufgaben asynchron zu verzögern, ohne einen separaten Timer oder Coroutine starten zu müssen. Typische Anwendungsfälle sind das Aufräumen von Ressourcen nach einer I/O-Operation, das Bündeln mehrerer Operationen am Ende eines Event-Zyklus oder das Vermeiden von tiefen Aufruf-Stapeln (Call-Stacks) durch Aufschieben von Folgeoperationen.

swoole_event_defer() verhält sich ähnlich wie setImmediate() in Node.js: Der Callback wird nicht sofort, sondern erst nach Abschluss des aktuellen I/O-Durchlaufs ausgeführt. Im Gegensatz zu swoole_timer_after() mit einem Delay von 0 wird hier kein Timer-Overhead erzeugt.

Die Funktion gehört zur Swoole-Erweiterung und steht nur zur Verfügung, wenn die swoole-Extension geladen ist. Sie ist nicht Teil der Standard-PHP-Bibliothek.

Parameter

Name Typ Default Beschreibung
$callback Pflicht callable Die Callback-Funktion, die beim nächsten Event-Loop-Durchlauf ausgeführt werden soll. Sie empfängt keine Parameter und hat keinen Rückgabewert.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Callback erfolgreich eingereiht wurde, andernfalls false.

Beispiele

Einfaches Defer eines Callbacks

<?php
// Swoole-Server-Kontext vorausgesetzt

swoole_event_defer(function () {
    echo "Dieser Code wird im nächsten Event-Loop-Durchlauf ausgeführt." . PHP_EOL;
});

echo "Dieser Code wird zuerst ausgeführt." . PHP_EOL;
Dieser Code wird zuerst ausgeführt. Dieser Code wird im nächsten Event-Loop-Durchlauf ausgeführt.

Ressourcen nach I/O-Operation aufräumen

<?php
// In einem Swoole-HTTP-Server-Kontext
$server = new Swoole\HTTP\Server('0.0.0.0', 9501);

$server->on('request', function ($request, $response) {
    $tempFile = '/tmp/upload_' . uniqid() . '.tmp';

    // Temporäre Datei schreiben
    file_put_contents($tempFile, $request->rawContent());

    // Antwort sofort senden
    $response->end('Datei empfangen.');

    // Aufräumen auf den nächsten Event-Loop-Durchlauf verschieben
    swoole_event_defer(function () use ($tempFile) {
        if (file_exists($tempFile)) {
            unlink($tempFile);
            echo "Temporäre Datei {$tempFile} gelöscht." . PHP_EOL;
        }
    });
});

$server->start();

// Wichtig · Fallstricke

Achtung: swoole_event_defer() setzt eine laufende Swoole-Event-Loop voraus. Außerhalb eines Swoole-Kontexts (z. B. in einem normalen PHP-CLI-Skript ohne Event-Loop) wird der Callback möglicherweise nicht oder nicht zum erwarteten Zeitpunkt ausgeführt.

Mehrfach nacheinander aufgerufene swoole_event_defer()-Callbacks werden in der Reihenfolge ihrer Registrierung im nächsten Event-Loop-Durchlauf ausgeführt (FIFO-Prinzip).

In neueren Versionen der Swoole-Erweiterung wird empfohlen, statt der globalen Funktion die Methode Swoole\Event::defer() zu verwenden, da die prozeduralen Aliasse perspektivisch als veraltet gelten können.