Start · Sprachen · PHP · Referenz · swoole_event_wait

swoole_event_wait

Funktion

Startet die Swoole-Ereignisschleife und blockiert den aktuellen Prozess, bis alle registrierten Ereignisse abgearbeitet sind.

Kategorie: misc

Signatur

swoole_event_wait(): void

Beschreibung

swoole_event_wait() startet die interne Event-Loop von Swoole und blockiert die weitere Ausführung des Skripts, bis keine aktiven Ereignis-Handler mehr vorhanden sind. Sie wird typischerweise am Ende eines Skripts aufgerufen, das asynchrone I/O-Operationen, Timer oder andere nicht-blockierende Swoole-Features nutzt.

Ohne diesen Aufruf würde ein PHP-Skript sofort nach dem Registrieren asynchroner Callbacks beenden, noch bevor diese ausgeführt werden konnten. swoole_event_wait() hält den Prozess am Leben und gibt der Ereignisschleife Zeit, alle ausstehenden Ereignisse zu verarbeiten.

Diese Funktion ist besonders nützlich in reinen PHP-Skripten (ohne einen Swoole-Server), wenn man einzelne asynchrone Operationen – etwa TCP-Client-Verbindungen, Datei-I/O oder Timer – ausprobieren oder einsetzen möchte. Im Kontext eines laufenden Swoole\Server oder Swoole\Coroutine\run() ist sie in der Regel nicht notwendig, da diese ihre eigene Event-Loop verwalten.

Nach dem Beenden aller registrierten Ereignisse kehrt die Funktion zurück und das Skript wird normal fortgesetzt bzw. beendet.

Rückgabewert

Typ
void
Beschreibung
Gibt keinen Wert zurück. Die Funktion blockiert, bis die Ereignisschleife leer ist, und kehrt dann zurück.

Beispiele

Asynchroner TCP-Client mit Event-Loop

<?php
// Asynchrone TCP-Verbindung zu einem Echo-Server
$socket = swoole_event_add(
    stream_socket_client('tcp://127.0.0.1:9501', $errno, $errstr, 30),
    function ($socket) {
        $data = fread($socket, 8192);
        echo "Empfangen: " . $data . PHP_EOL;
        swoole_event_del($socket);
        fclose($socket);
    }
);

// Event-Loop starten – blockiert bis alle Ereignisse abgearbeitet sind
swoole_event_wait();

echo "Event-Loop beendet." . PHP_EOL;
Empfangen: Hello World Event-Loop beendet.

Timer-basiertes Beispiel mit swoole_event_wait

<?php
// Führe einen einmaligen Timer nach 1 Sekunde aus
swoole_timer_after(1000, function () {
    echo "Timer ausgelöst nach 1 Sekunde." . PHP_EOL;
});

echo "Warte auf Timer..." . PHP_EOL;

// Blockiert, bis der Timer abgelaufen und sein Callback ausgeführt wurde
swoole_event_wait();

echo "Fertig." . PHP_EOL;
Warte auf Timer... Timer ausgelöst nach 1 Sekunde. Fertig.

// Wichtig · Fallstricke

Achtung: swoole_event_wait() sollte nicht innerhalb einer Coroutine oder eines laufenden Swoole-Servers aufgerufen werden, da dort bereits eine eigene Event-Loop aktiv ist. Ein verschachtelter Aufruf kann zu unerwartetem Verhalten oder Deadlocks führen.

Die Funktion ist Teil der prozeduralen Swoole-API. Bei Verwendung des objektorientierten Stils (Swoole\Event::wait()) steht die identische Funktionalität als statische Methode zur Verfügung.

Da Swoole eine PECL-Extension ist, muss sie separat installiert und in der php.ini geladen werden. Die Funktion steht nicht in einer Standard-PHP-Installation zur Verfügung.