Start · Sprachen · PHP · Referenz · eio_init

eio_init

Funktion

Initialisiert (oder re-initialisiert) die <code>eio</code>-Erweiterung und deren interne Strukturen für asynchrone E/A-Operationen.

seit PHP 0.5.0 Kategorie: io

Signatur

eio_init(): void

Beschreibung

eio_init() initialisiert die eio-Bibliothek sowie alle internen Datenstrukturen, die für die asynchrone, nicht-blockierende Datei-E/A benötigt werden. In der Regel ist ein expliziter Aufruf nicht notwendig, da die Initialisierung automatisch beim ersten Einsatz einer eio_*-Funktion erfolgt.

Ein erneuter Aufruf (Re-Initialisierung) kann sinnvoll sein, wenn nach einem fork()-Aufruf im Kindprozess die eio-Umgebung in einen sauberen Zustand zurückversetzt werden soll, da Worker-Threads und interne Warteschlangen vom Elternprozess geerbt werden könnten und so zu undefiniertem Verhalten führen würden.

Die Funktion gehört zur eio-PECL-Erweiterung, die ereignisgesteuerte, asynchrone Dateioperationen (Lesen, Schreiben, Stat, Rename usw.) ohne Blockierung des Hauptprozesses ermöglicht. Sie wird typischerweise zusammen mit Event-Loop-Bibliotheken wie libevent oder libev verwendet.

Da eio_init() keine Parameter entgegennimmt und keinen Rückgabewert liefert, ist ihr Einsatz sehr einfach gehalten. Sie sollte möglichst früh im Programmablauf aufgerufen werden, wenn eine explizite Steuerung der Initialisierung gewünscht ist.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück.

Beispiele

Einfache Initialisierung und asynchrones Lesen einer Datei

<?php
// Explizite Initialisierung der eio-Erweiterung
eio_init();

// Datei asynchron lesen
eio_open('/etc/hostname', EIO_O_RDONLY, 0, EIO_PRI_DEFAULT, function ($data, $result) {
    if ($result === -1) {
        echo 'Fehler beim Öffnen der Datei.' . PHP_EOL;
        return;
    }
    eio_read($result, 64, 0, EIO_PRI_DEFAULT, function ($data, $content) use ($result) {
        echo 'Dateiinhalt: ' . $content . PHP_EOL;
        eio_close($result);
    });
});

// Event-Loop starten
eio_event_loop();
Dateiinhalt: mein-hostname

Re-Initialisierung nach fork()

<?php
$pid = pcntl_fork();

if ($pid === -1) {
    die('fork() fehlgeschlagen');
} elseif ($pid === 0) {
    // Kindprozess: eio neu initialisieren, um sauberen Zustand zu gewährleisten
    eio_init();

    eio_mkdir('/tmp/eio_test_dir', 0755, EIO_PRI_DEFAULT, function ($data, $result) {
        echo 'Verzeichnis erstellt: ' . ($result === 0 ? 'ja' : 'nein') . PHP_EOL;
    });

    eio_event_loop();
    exit(0);
} else {
    // Elternprozess wartet auf Kindprozess
    pcntl_wait($status);
    echo 'Kindprozess beendet.' . PHP_EOL;
}
Verzeichnis erstellt: ja Kindprozess beendet.

// Wichtig · Fallstricke

Achtung bei fork(): Nach einem fork() sollte eio_init() im Kindprozess aufgerufen werden, bevor weitere eio_*-Funktionen genutzt werden. Andernfalls können gemeinsam genutzte Worker-Threads und Dateideskriptoren zu Race Conditions oder Datenverlust führen.

Die eio-Erweiterung ist eine PECL-Erweiterung und nicht standardmäßig in PHP enthalten. Sie muss separat installiert werden (pecl install eio). Eine kompatible Libc (glibc ab 2.x) oder libeio ist Voraussetzung.

Im normalen Betrieb ohne fork() ist ein expliziter Aufruf von eio_init() nicht erforderlich, da die Erweiterung sich selbst initialisiert.