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