Signatur
Beschreibung
dio_open() ist Teil der Direct I/O-Erweiterung und öffnet eine Datei direkt über den Betriebssystem-Syscall, ohne den zusätzlichen Puffer der C-Bibliothek (stdio). Das ermöglicht exakte Kontrolle über Flags wie O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC und O_NONBLOCK, die direkt dem POSIX-open()-Aufruf entsprechen.
Typische Einsatzbereiche sind der Zugriff auf serielle Schnittstellen (/dev/ttyS0), Gerätedateien und Szenarien, in denen ein blockierendes oder nicht-blockierendes I/O-Verhalten auf niedrigster Ebene benötigt wird – z. B. in der Embedded- oder Industriekommunikation.
Der zurückgegebene Ressource-Handle wird ausschließlich von den anderen dio_*-Funktionen (dio_read(), dio_write(), dio_close() usw.) verwendet und ist nicht mit Standard-PHP-Stream-Funktionen wie fread() kompatibel.
Die Erweiterung muss separat installiert (PECL) bzw. bei der PHP-Kompilierung aktiviert werden und steht hauptsächlich auf Unix-ähnlichen Systemen zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $filename Pflicht | string | Pfad zur zu öffnenden oder zu erzeugenden Datei bzw. Gerätedatei (z. B. /dev/ttyS0 oder /tmp/test.bin). |
|
| $flags Pflicht | int | Bitmaske aus POSIX-Flags, die den Öffnungsmodus bestimmen. Übliche Konstanten: O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC, O_APPEND, O_NONBLOCK. Mindestens eines der Zugriffsflags (O_RDONLY, O_WRONLY oder O_RDWR) muss gesetzt sein. |
|
| $mode | int | 0 | Dateiberechtigungen (Oktalwert, z. B. 0644), die beim Anlegen einer neuen Datei verwendet werden. Dieser Parameter wird nur berücksichtigt, wenn O_CREAT in flags gesetzt ist. |
Rückgabewert
dio_*-Funktionen weiterverwendet werden kann. Im Fehlerfall (z. B. Datei nicht vorhanden, fehlende Berechtigung) wird false zurückgegeben.Beispiele
Datei lesen und schreiben mit Direct I/O
<?php
// Datei öffnen/anlegen zum Lesen und Schreiben
$fd = dio_open('/tmp/dio_test.txt', O_RDWR | O_CREAT | O_TRUNC, 0644);
if ($fd === false) {
die('Datei konnte nicht geöffnet werden.');
}
// Schreiben
dio_write($fd, "Hallo Direct I/O!\n");
// Zurück an den Anfang (Position 0)
dio_seek($fd, 0);
// Lesen
$inhalt = dio_read($fd, 64);
echo $inhalt;
// Ressource schließen
dio_close($fd);
Serielle Schnittstelle nicht-blockierend öffnen
<?php
// Serielle Schnittstelle nicht-blockierend öffnen (typisch für Embedded-Kommunikation)
$fd = dio_open('/dev/ttyS0', O_RDWR | O_NONBLOCK);
if ($fd === false) {
die('Serielle Schnittstelle konnte nicht geöffnet werden.');
}
// Optionale Konfiguration der Schnittstelle
dio_tcsetattr($fd, [
'baud' => 9600,
'bits' => 8,
'stop' => 1,
'parity' => 0,
]);
// Befehl senden
dio_write($fd, "AT\r\n");
// Antwort lesen (maximal 128 Bytes)
$antwort = dio_read($fd, 128);
echo 'Antwort: ' . $antwort;
dio_close($fd);
// Wichtig · Fallstricke
Verfügbarkeit: Die dio-Erweiterung ist kein Bestandteil der Standard-PHP-Distribution. Sie muss über PECL installiert (pecl install dio) oder beim Kompilieren mit --enable-dio aktiviert werden. Auf Windows-Systemen ist die Unterstützung stark eingeschränkt.
Flags: Die POSIX-Konstanten (O_RDONLY, O_CREAT etc.) sind nur verfügbar, wenn die Erweiterung geladen ist. Außerdem sind die genauen Werte plattformabhängig – eine manuelle Zuweisung von Integer-Werten ist daher fehleranfällig.
Ressource vs. Stream: Der zurückgegebene Deskriptor ist keine PHP-Stream-Ressource und darf nicht mit fread(), fwrite() oder ähnlichen Funktionen verwendet werden. Nur dio_read(), dio_write(), dio_seek() und dio_close() sind kompatibel.
Sicherheit: Beim Öffnen von Gerätedateien oder Dateien mit vom Benutzer kontrollierten Pfaden unbedingt eine strenge Pfadvalidierung durchführen, um Path-Traversal-Angriffe (../../etc/passwd) zu verhindern.