Signatur
Beschreibung
dio_read() gehört zur Direct-I/O-Erweiterung von PHP und liest Daten direkt vom Betriebssystem, ohne den Standard-PHP-Stream-Layer oder seine Puffer zu verwenden. Dies ist besonders nützlich, wenn niedrig-niveau Datei- oder Gerätezugriffe benötigt werden – etwa für serielle Schnittstellen, spezielle Gerätedateien (/dev/ttyS0) oder wenn das Caching des Stream-Layers explizit vermieden werden soll.
Der Parameter $len gibt die maximale Anzahl von Bytes an, die gelesen werden sollen. Tatsächlich können weniger Bytes zurückgegeben werden, wenn das Ende der Datei erreicht wird oder wenn der Deskriptor nicht genügend Daten bereitstellt (z. B. bei Pipes oder seriellen Geräten).
Ein gültiger Dateideskriptor muss zuvor mit dio_open() geöffnet worden sein. Die Funktion gibt false zurück, wenn ein Fehler auftritt oder kein Byte gelesen werden konnte.
Hinweis: Die dio-Erweiterung ist nicht standardmäßig in PHP enthalten und muss separat aktiviert oder über PECL installiert werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $fd Pflicht | resource | Ein gültiger Dateideskriptor, der mit dio_open() geöffnet wurde. |
|
| $len | int | 1024 | Maximale Anzahl von Bytes, die gelesen werden sollen. Standardmäßig 1024. |
Rückgabewert
false zurückgegeben.Beispiele
Einfaches Lesen aus einer Datei mit dio_read
<?php
// Datei im Lesemodus öffnen
$fd = dio_open('/tmp/testdatei.txt', O_RDONLY);
if ($fd === false) {
die('Datei konnte nicht geöffnet werden.');
}
// Bis zu 256 Bytes lesen
$daten = dio_read($fd, 256);
if ($daten !== false) {
echo 'Gelesene Daten: ' . $daten;
} else {
echo 'Fehler beim Lesen.';
}
dio_close($fd);
?>
Gesamten Dateiinhalt blockweise einlesen
<?php
$fd = dio_open('/tmp/grosse_datei.bin', O_RDONLY);
if ($fd === false) {
die('Datei konnte nicht geöffnet werden.');
}
$gesamt = '';
$blockgroesse = 512;
while (($block = dio_read($fd, $blockgroesse)) !== false && $block !== '') {
$gesamt .= $block;
}
dio_close($fd);
echo 'Gesamtgröße der gelesenen Daten: ' . strlen($gesamt) . ' Bytes';
?>
Lesen von einer seriellen Schnittstelle
<?php
// Serielle Schnittstelle öffnen
$fd = dio_open('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK);
if ($fd === false) {
die('Serielle Schnittstelle konnte nicht geöffnet werden.');
}
// Parameter setzen (9600 Baud, 8N1)
dio_tcsetattr($fd, [
'baud' => 9600,
'bits' => 8,
'stop' => 1,
'parity' => 0,
]);
// Bis zu 128 Bytes von der seriellen Schnittstelle lesen
$antwort = dio_read($fd, 128);
if ($antwort !== false) {
echo 'Empfangen: ' . bin2hex($antwort);
} else {
echo 'Keine Daten empfangen oder Fehler aufgetreten.';
}
dio_close($fd);
?>
// Wichtig · Fallstricke
Erweiterung: Die dio-Erweiterung ist nicht Bestandteil des PHP-Standardumfangs. Unter Linux/Unix kann sie über PECL (pecl install dio) oder direkt beim Kompilieren mit --enable-dio eingebunden werden. Unter Windows ist die Unterstützung eingeschränkt.
Rückgabewert im EOF-Fall: Am Ende der Datei kann dio_read() einen leeren String ('') zurückgeben, statt false. Eine robuste Schleife sollte daher sowohl auf false als auch auf den leeren String prüfen.
Blockierende vs. nicht-blockierende Deskriptoren: Wenn der Deskriptor im nicht-blockierenden Modus geöffnet wurde (z. B. mit O_NONBLOCK), kann dio_read() sofort mit false zurückkehren, wenn keine Daten verfügbar sind. Für produktive Anwendungen sollte dio_read() daher in Verbindung mit einer geeigneten Wartestrategie (z. B. usleep()) oder Signalverarbeitung eingesetzt werden.