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