Start · Sprachen · PHP · Referenz · dio_read

dio_read

Funktion

Liest bis zu <code>$len</code> Bytes direkt von einem Dateideskriptor und gibt die gelesenen Daten als String zurück.

seit PHP 4.2.0 Kategorie: io

Signatur

dio_read(resource $fd, int $len = 1024): string|false

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

Typ
string|false
Beschreibung
Gibt die gelesenen Daten als String zurück. Wenn ein Fehler auftritt oder nichts gelesen werden konnte, wird 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);
?>
Gelesene Daten: (Inhalt der Datei, bis zu 256 Bytes)

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';
?>
Gesamtgröße der gelesenen Daten: (Anzahl Bytes der Datei)

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.