Start · Sprachen · PHP · Referenz · eio_unlink

eio_unlink

Funktion

Löscht eine Datei asynchron über die <code>eio</code>-Erweiterung (entspricht dem POSIX-<code>unlink()</code>-Systemaufruf).

seit PHP 1.0.0 Kategorie: io

Signatur

eio_unlink(string $path, int $pri = EIO_PRI_DEFAULT, callable $callback = NULL, mixed $data = NULL): resource

Beschreibung

eio_unlink() entfernt einen Dateinamen aus dem Dateisystem. Handelt es sich um den letzten Hard-Link zur Datei und ist keine Prozessdateideskriptor mehr offen, wird der tatsächliche Speicher der Datei freigegeben. Die Funktion arbeitet nicht-blockierend: Die Operation wird in die Event-Schleife der eio-Erweiterung eingereiht und kehrt sofort zurück.

Der Aufruf ist besonders nützlich in hochperformanten Server-Anwendungen oder Daemons, bei denen das synchrone Warten auf Dateioperationen Latenzen erzeugen würde. Ähnlich wie Node.js nutzt eio intern ein Thread-Pool-Modell, um Syscalls auszulagern.

Das Ergebnis der Operation wird über den $callback gemeldet. Dieser erhält als dritten Parameter $result, der bei Erfolg 0 und bei Fehler -1 ist. Mit eio_get_last_error() kann anschließend die genaue Fehlerursache abgefragt werden.

Damit die Callbacks aufgerufen werden, muss die Event-Schleife laufen – typischerweise über eio_event_loop() oder in Kombination mit libevent/ev.

Parameter

Name Typ Default Beschreibung
$path Pflicht string Pfad zur Datei, die gelöscht werden soll. Verzeichnisse können damit nicht entfernt werden – dafür ist eio_rmdir() zu verwenden.
$pri int EIO_PRI_DEFAULT Priorität der asynchronen Operation. Mögliche Werte: EIO_PRI_MIN, EIO_PRI_DEFAULT, EIO_PRI_MAX oder NULL (entspricht EIO_PRI_DEFAULT).
$callback callable NULL Callback-Funktion mit der Signatur function(mixed $data, int $result, resource $req): void. $result ist bei Erfolg 0, bei Fehler -1.
$data mixed NULL Beliebige Nutzdaten, die unverändert an den $callback übergeben werden. Nützlich, um Kontext (z. B. Dateinamen oder Objekte) in den Callback zu transportieren.

Rückgabewert

Typ
resource|false
Beschreibung
Gibt eine eio-Request-Ressource zurück, die die eingereihte Operation repräsentiert, oder false bei einem Fehler beim Einreihen der Anforderung.

Beispiele

Einfaches asynchrones Löschen einer Datei

<?php
// Voraussetzung: eio-Erweiterung ist geladen

$tempFile = '/tmp/eio_test_' . uniqid() . '.txt';
file_put_contents($tempFile, 'Test-Inhalt');

$callback = function(mixed $data, int $result, $req): void {
    if ($result === 0) {
        echo "Datei erfolgreich gelöscht: " . $data['path'] . PHP_EOL;
    } else {
        echo "Fehler beim Löschen: " . eio_get_last_error($req) . PHP_EOL;
    }
};

$req = eio_unlink(
    $tempFile,
    EIO_PRI_DEFAULT,
    $callback,
    ['path' => $tempFile]
);

if ($req === false) {
    echo "Fehler: Operation konnte nicht eingereiht werden." . PHP_EOL;
}

// Event-Schleife starten, bis alle Operationen abgeschlossen sind
eio_event_loop();
Datei erfolgreich gelöscht: /tmp/eio_test_<id>.txt

Mehrere Dateien parallel asynchron löschen

<?php
$files = [];
for ($i = 0; $i < 5; $i++) {
    $path = '/tmp/eio_bulk_' . $i . '.txt';
    file_put_contents($path, 'Inhalt ' . $i);
    $files[] = $path;
}

$pending = count($files);

foreach ($files as $file) {
    eio_unlink($file, EIO_PRI_DEFAULT, function(mixed $data, int $result) use (&$pending): void {
        if ($result === 0) {
            echo "Gelöscht: {$data}\n";
        } else {
            echo "Fehler bei: {$data}\n";
        }
        $pending--;
    }, $file);
}

// Blockiert, bis alle Callbacks ausgeführt wurden
while ($pending > 0) {
    eio_poll();
}

echo "Alle Dateien verarbeitet.\n";
Gelöscht: /tmp/eio_bulk_0.txt Gelöscht: /tmp/eio_bulk_1.txt Gelöscht: /tmp/eio_bulk_2.txt Gelöscht: /tmp/eio_bulk_3.txt Gelöscht: /tmp/eio_bulk_4.txt Alle Dateien verarbeitet.

// Wichtig · Fallstricke

Sicherheit: Stellen Sie sicher, dass der $path-Parameter niemals direkt aus Benutzereingaben übernommen wird, ohne ihn vorher zu validieren. Ein unsanitierter Pfad kann dazu führen, dass beliebige Systemdateien gelöscht werden (Path-Traversal-Angriff). Verwenden Sie realpath() und prüfen Sie, ob der Pfad innerhalb eines erlaubten Verzeichnisses liegt.

Verzeichnisse: eio_unlink() schlägt fehl, wenn $path auf ein Verzeichnis zeigt. Verwenden Sie in diesem Fall eio_rmdir().

Fehlererkennung: Da die Operation asynchron ist, wird ein Fehler erst im Callback sichtbar. Überprüfen Sie $result === -1 und rufen Sie eio_get_last_error($req) auf, um den genauen POSIX-Fehlercode zu erhalten.

Event-Schleife: Ohne einen laufenden Event-Loop (z. B. eio_event_loop() oder eio_poll() in einer Schleife) werden die Callbacks nie ausgeführt. In Kombination mit libevent oder ev kann dies in reaktive Anwendungen integriert werden.