Start · Sprachen · PHP · Referenz · Swoole\Async

Swoole\Async

Klasse

Stellt statische Methoden für asynchrone, nicht-blockierende Dateisystemoperationen und DNS-Auflösungen in Swoole-Anwendungen bereit.

seit PHP 1.8.0 Kategorie: misc

Signatur

class Swoole\Async

Beschreibung

Swoole\Async ist eine Hilfsklasse der Swoole-Erweiterung, die nicht-blockierende Dateioperationen sowie asynchrone DNS-Auflösung ermöglicht. Während klassische PHP-Dateifunktionen wie file_get_contents() den aktuellen Ausführungsfluss blockieren, arbeiten die Methoden dieser Klasse ereignisgesteuert: Der Aufruf kehrt sofort zurück und das Ergebnis wird über einen Callback geliefert, sobald die Operation abgeschlossen ist.

Die Klasse eignet sich besonders für Swoole-basierte Server-Applikationen (z. B. HTTP- oder WebSocket-Server), bei denen der Event-Loop nicht durch langsame I/O-Zugriffe blockiert werden darf. Typische Anwendungsfälle sind das asynchrone Einlesen großer Dateien, das nicht-blockierende Schreiben von Log-Daten sowie die schnelle Namensauflösung ohne Wartezeit.

Hinweis: Ab Swoole 4.x wurde ein Großteil der Async-Funktionalität in Coroutinen (Swoole\Coroutine\System) überführt. Swoole\Async steht in neueren Versionen teilweise nur noch mit dem separaten swoole_async-Modul zur Verfügung oder ist als deprecated markiert. Für neue Projekte wird die Coroutine-API empfohlen.

  • Swoole\Async::readFile() – liest eine Datei asynchron und liefert den Inhalt im Callback.
  • Swoole\Async::writeFile() – schreibt Daten asynchron in eine Datei.
  • Swoole\Async::dnsLookup() – löst einen Hostnamen asynchron über DNS auf.

Beispiele

Datei asynchron einlesen mit Swoole\Async::readFile()

<?php
// Voraussetzung: Swoole-Erweiterung mit Async-Unterstützung installiert
// Der Code muss innerhalb eines Swoole-Event-Loops laufen (z. B. in einem Server-Callback)

$server = new Swoole\HTTP\Server('127.0.0.1', 9501);

$server->on('request', function (Swoole\HTTP\Request $request, Swoole\HTTP\Response $response) {
    // Datei wird asynchron gelesen — der Event-Loop bleibt frei
    Swoole\Async::readFile('/var/www/data/config.json', function (string $filename, string $content) use ($response) {
        $response->header('Content-Type', 'application/json');
        $response->end($content);
    });
});

$server->start();

Asynchrone DNS-Auflösung mit Swoole\Async::dnsLookup()

<?php
// Asynchrone DNS-Auflösung: blockiert den Event-Loop nicht

Swoole\Async::dnsLookup('www.example.com', function (string $hostname, string $ip) {
    if ($ip === '') {
        echo "DNS-Auflösung für {$hostname} fehlgeschlagen." . PHP_EOL;
    } else {
        echo "Hostname: {$hostname} => IP: {$ip}" . PHP_EOL;
    }
});

// Swoole Event-Loop starten, damit der Callback ausgeführt wird
Swoole\Event::wait();
Hostname: www.example.com => IP: 93.184.216.34

Datei asynchron schreiben mit Swoole\Async::writeFile()

<?php
// Schreibt Daten asynchron in eine Datei
$logEntry = date('[Y-m-d H:i:s]') . ' Benutzer hat sich eingeloggt.' . PHP_EOL;

Swoole\Async::writeFile('/tmp/app.log', $logEntry, function (string $filename) {
    echo "Datei '{$filename}' erfolgreich geschrieben." . PHP_EOL;
}, FILE_APPEND); // FILE_APPEND: Inhalt wird angehängt, nicht überschrieben

Swoole\Event::wait();
Datei '/tmp/app.log' erfolgreich geschrieben.

// Wichtig · Fallstricke

Deprecation: Ab Swoole 4.3+ ist Swoole\Async in vielen Builds nicht mehr im Kern enthalten und muss über das separate swoole_async-Paket nachinstalliert werden. Für neue Projekte sollte stattdessen die Coroutine-API (Swoole\Coroutine\System::readFile(), Swoole\Coroutine\System::dnsLookup() etc.) verwendet werden, die einfacher zu handhaben ist und keine Callback-Verschachtelung erfordert.

Event-Loop: Die Callbacks werden nur ausgeführt, wenn der Swoole-Event-Loop aktiv ist (d. h. innerhalb eines Servers oder nach explizitem Swoole\Event::wait()-Aufruf). Außerhalb des Event-Loops werden Callbacks nie aufgerufen.

Fehlerbehandlung: Viele Methoden liefern im Fehlerfall einen leeren String oder false als Parameter im Callback. Es gibt keine automatische Exception — die Rückgabewerte im Callback müssen explizit geprüft werden.