Start · Sprachen · PHP · Referenz · eio_mkdir

eio_mkdir

Funktion

Erstellt asynchron ein Verzeichnis unter dem angegebenen Pfad mit den gewünschten Berechtigungen.

seit PHP 0.0.1dev Kategorie: io

Signatur

eio_mkdir(string $path, int $mode, int $pri = EIO_PRI_DEFAULT, callable $callback = null, mixed $data = null): resource|false

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

Typ
resource|false
Beschreibung
Gibt eine EIO-Request-Ressource zurück, mit der die Operation über 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 erfolgreich erstellt: /tmp/eio_test_dir

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();
}
Fehler: No such file or directory beim Anlegen von: /tmp/nicht_vorhanden/unterverzeichnis

// 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.