Signatur
Beschreibung
eio_mkdir() ist Teil der EIO-Erweiterung (Asynchronous POSIX I/O) und erstellt ein Verzeichnis nicht-blockierend. Intern wird der Aufruf an einen Thread-Pool übergeben, sodass das PHP-Hauptprogramm weiterlaufen kann, während das Betriebssystem das Verzeichnis anlegt. Diese Funktion eignet sich besonders für I/O-intensive Anwendungen oder Event-Loops (z. B. mit libevent oder ReactPHP), bei denen blockierende Dateisystemoperationen vermieden werden sollen.
Der Parameter $mode legt die Zugriffsrechte des neuen Verzeichnisses fest (analog zu mkdir()). Beachte, dass der Wert durch die aktuelle umask des Prozesses beeinflusst wird. Typische Werte sind 0755 (oktal) für öffentlich lesbare Verzeichnisse oder 0700 für private.
Nach Abschluss der Operation wird die angegebene $callback-Funktion aufgerufen. Sie erhält die Parameter $data (benutzerdefinierte Zusatzdaten), den Rückgabewert der Operation (0 bei Erfolg, -1 bei Fehler) sowie einen Fehlercode. Ohne aktiven EIO-Event-Loop muss eio_event_loop() aufgerufen werden, damit ausstehende Callbacks abgearbeitet werden.
Die Funktion gibt eine Request-Ressource zurück, über die der laufende Auftrag mit eio_cancel() abgebrochen werden kann. Bei sofortigem Fehler (z. B. ungültige Argumente) wird false zurückgegeben.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $path Pflicht | string | Der Pfad des zu erstellenden Verzeichnisses, z. B. /var/www/uploads/neu. Nur das letzte Element des Pfades wird angelegt; übergeordnete Verzeichnisse müssen bereits existieren. |
|
| $mode Pflicht | int | Oktalwert der Verzeichnisberechtigungen, z. B. 0755. Der tatsächlich gesetzte Wert wird durch die Prozess-umask maskiert. |
|
| $pri | int | EIO_PRI_DEFAULT | Priorität der Anfrage. Mögliche Werte: EIO_PRI_MIN, EIO_PRI_DEFAULT, EIO_PRI_MAX. |
| $callback | callable | null | Callback-Funktion, die nach Abschluss aufgerufen wird. Signatur: function(mixed $data, int $result, resource $req): void. $result ist 0 bei Erfolg oder -1 bei Fehler. |
| $data | mixed | null | Beliebige benutzerdefinierte Daten, die unverändert an den $callback weitergereicht werden. |
Rückgabewert
eio_cancel() abgebrochen werden kann. Gibt false zurück, wenn die Anfrage nicht erstellt werden konnte.Beispiele
Einfaches asynchrones Erstellen eines Verzeichnisses
<?php
// EIO-Erweiterung vorausgesetzt (pecl install eio)
$path = sys_get_temp_dir() . '/eio_test_dir';
eio_mkdir($path, 0755, EIO_PRI_DEFAULT, function ($data, $result, $req) {
if ($result === 0) {
echo "Verzeichnis erfolgreich erstellt: " . $data . PHP_EOL;
} else {
echo "Fehler beim Erstellen: " . eio_get_last_error($req) . PHP_EOL;
}
}, $path);
// Event-Loop ausführen, bis alle Aufgaben abgeschlossen sind
eio_event_loop();
Verzeichnis erstellen und Fehlerbehandlung mit eio_get_last_error()
<?php
// Versuch, ein Verzeichnis in einem nicht vorhandenen übergeordneten Pfad zu erstellen
$path = '/tmp/nicht_vorhanden/unterverzeichnis';
$req = eio_mkdir($path, 0700, EIO_PRI_DEFAULT, function ($data, $result, $req) {
if ($result === 0) {
echo "Erstellt: " . $data . PHP_EOL;
} else {
// Fehlercode über eio_get_last_error() ermitteln
$error = eio_get_last_error($req);
echo "Fehler: " . $error . " beim Anlegen von: " . $data . PHP_EOL;
}
}, $path);
if ($req === false) {
echo "Anfrage konnte nicht erstellt werden." . PHP_EOL;
} else {
eio_event_loop();
}
// Wichtig · Fallstricke
Hinweis zur Verfügbarkeit: eio_mkdir() ist nur verfügbar, wenn die PECL-Erweiterung eio installiert und aktiviert ist. Sie ist nicht Teil der PHP-Standarddistribution.
Rekursive Erstellung: Anders als mkdir() mit dem Parameter $recursive = true unterstützt eio_mkdir() keine rekursive Verzeichniserstellung. Alle übergeordneten Verzeichnisse müssen vorab existieren.
Event-Loop: Ohne einen integrierten Event-Loop (z. B. libevent) muss eio_event_loop() explizit aufgerufen werden, damit die Callbacks ausgeführt werden. In reinen Event-Driven-Umgebungen wird die Integration über eio_get_event_stream() empfohlen.
Umask: Die tatsächlich gesetzten Berechtigungen entsprechen $mode & ~umask(). Um den exakten $mode-Wert zu erhalten, muss die umask vorher auf 0 gesetzt werden.