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