Signatur
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
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();
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();
// 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.