Start · Sprachen · PHP · Referenz · swoole_async_readfile

swoole_async_readfile

Funktion

Liest den gesamten Inhalt einer Datei asynchron und ruft nach Abschluss eine Callback-Funktion auf.

Kategorie: misc

Signatur

swoole_async_readfile(string $filename, callable $callback): bool

Beschreibung

swoole_async_readfile ist eine Funktion der Swoole-Erweiterung und ermöglicht es, eine Datei vollständig in den Speicher zu lesen, ohne den laufenden PHP-Prozess dabei zu blockieren. Die Funktion kehrt sofort zurück, während der eigentliche Lesevorgang im Hintergrund stattfindet. Sobald die Datei vollständig gelesen wurde, wird die angegebene Callback-Funktion aufgerufen.

Diese Funktion ist besonders nützlich in asynchronen oder ereignisgesteuerten Anwendungen (z.B. Swoole-Server), bei denen blockierende I/O-Operationen die gesamte Event-Loop verlangsamen würden. Statt mit file_get_contents() synchron zu blockieren, gibt man dem System die Kontrolle zurück und verarbeitet das Ergebnis erst im Callback.

Der Callback erhält zwei Parameter: den Dateinamen und den Dateiinhalt als String. Zu beachten ist, dass swoole_async_readfile die gesamte Datei auf einmal in den Speicher lädt – bei sehr großen Dateien sollte stattdessen swoole_async_read mit Chunk-Größen verwendet werden.

Hinweis: Diese Funktion ist Teil der älteren Swoole-API und wurde in neueren Versionen (ab Swoole 4.x) als veraltet markiert. In modernen Swoole-Projekten wird die Verwendung von Coroutinen mit Swoole\Coroutine\System::readFile() empfohlen.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zur Datei, die asynchron gelesen werden soll. Der Pfad kann absolut oder relativ sein.
$callback Pflicht callable Eine Callback-Funktion, die aufgerufen wird, wenn der Lesevorgang abgeschlossen ist. Sie erhält zwei Parameter: string $filename (der Dateiname) und string $content (der vollständige Dateiinhalt).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der asynchrone Lesevorgang erfolgreich initiiert wurde, andernfalls false (z.B. wenn die Datei nicht gefunden wurde oder kein Leserecht besteht).

Beispiele

Einfaches asynchrones Auslesen einer Textdatei

<?php
// Swoole-Erweiterung muss installiert sein

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

$server->on('request', function ($request, $response) {
    swoole_async_readfile('/var/www/html/data.txt', function (string $filename, string $content) use ($response) {
        echo "Datei '{$filename}' wurde gelesen." . PHP_EOL;
        $response->header('Content-Type', 'text/plain');
        $response->end($content);
    });
});

$server->start();
Datei '/var/www/html/data.txt' wurde gelesen.

Asynchrones Lesen außerhalb eines Servers (mit Event-Loop)

<?php
// Datei zum Testen anlegen
file_put_contents('/tmp/test_async.txt', 'Hallo aus der asynchronen Welt!');

swoole_async_readfile('/tmp/test_async.txt', function (string $filename, string $content): void {
    echo "Inhalt von {$filename}:" . PHP_EOL;
    echo $content . PHP_EOL;
});

// Event-Loop am Laufen halten, damit der Callback ausgeführt wird
Swoole\Event::wait();
Inhalt von /tmp/test_async.txt: Hallo aus der asynchronen Welt!

// Wichtig · Fallstricke

Deprecation: swoole_async_readfile gilt ab Swoole 4.x als veraltet (deprecated) und wurde in neueren Versionen entfernt. Für moderne Swoole-Anwendungen sollte stattdessen Swoole\Coroutine\System::readFile() innerhalb einer Coroutine verwendet werden, was sauberer und leistungsfähiger ist.

Speicherverbrauch: Die Funktion liest die gesamte Datei auf einmal in den Arbeitsspeicher. Bei großen Dateien (mehrere hundert MB oder mehr) kann dies zu Speicherproblemen führen. In solchen Fällen empfiehlt sich swoole_async_read, das die Datei in konfigurierbaren Blöcken (Chunks) verarbeitet.

Swoole-Kontext: Die Callback-Funktion wird innerhalb der Swoole-Event-Loop ausgeführt. Außerhalb eines Swoole-Servers muss Swoole\Event::wait() aufgerufen werden, damit die Event-Loop läuft und der Callback tatsächlich ausgeführt wird.