Start · Sprachen · PHP · Referenz · dio_open

dio_open

Funktion

Öffnet oder erzeugt eine Datei auf POSIX-Dateideskriptor-Ebene (unterhalb der C-Bibliotheks-Stream-Schicht) und gibt einen Direktzugriffs-Dateideskriptor zurück.

Kategorie: io

Signatur

dio_open(string $filename, int $flags, int $mode = 0): resource|false

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

Typ
resource|false
Beschreibung
Gibt bei Erfolg eine Dateideskriptor-Ressource zurück, die mit den 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);
Hallo Direct I/O!

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.