Start · Sprachen · PHP · Referenz · dio_write

dio_write

Funktion

Schreibt Daten direkt in einen via <code>dio_open()</code> geöffneten Dateideskriptor, ohne PHP-Puffer.

seit PHP 4.2.0 Kategorie: io

Signatur

dio_write(resource $fd, string $data, int $len = 0): string|false

Beschreibung

dio_write() gehört zur PHP-Erweiterung Direct I/O (dio) und ermöglicht das ungepufferte Schreiben von Daten in eine Datei oder ein Gerät, das mit dio_open() geöffnet wurde. Im Gegensatz zu fwrite() umgeht diese Funktion den PHP-internen Stream-Puffer und schreibt direkt über den Betriebssystem-Aufruf write().

Über den optionalen Parameter $len lässt sich die Anzahl der tatsächlich zu schreibenden Bytes begrenzen. Wird 0 übergeben oder der Parameter weggelassen, wird die gesamte Länge des übergebenen Strings geschrieben. Dies ist besonders nützlich, wenn man binäre Daten präzise steuern oder nur einen Teilstring schreiben möchte.

Typische Einsatzgebiete sind Low-Level-Zugriffe auf serielle Schnittstellen (z. B. /dev/ttyS0), spezielle Gerätedateien oder Situationen, in denen das Betriebssystem-Puffering ausdrücklich vermieden werden soll, etwa beim Schreiben in Named Pipes oder bei Echtzeit-Anforderungen.

Hinweis: Die dio-Erweiterung ist nicht standardmäßig in PHP enthalten und muss bei der Kompilierung oder als PECL-Paket eingebunden werden. Auf Windows-Systemen ist die Unterstützung eingeschränkt.

Parameter

Name Typ Default Beschreibung
$fd Pflicht resource Ein gültiger Dateideskriptor, der zuvor mit dio_open() geöffnet wurde.
$data Pflicht string Der zu schreibende Daten-String. Kann sowohl Text als auch binäre Daten enthalten.
$len int 0 Maximale Anzahl der zu schreibenden Bytes. Bei 0 oder weggelassenem Parameter wird der gesamte String geschrieben.

Rückgabewert

Typ
string|false
Beschreibung
Gibt im Erfolgsfall die Anzahl der tatsächlich geschriebenen Bytes als String zurück. Bei einem Fehler wird false zurückgegeben.

Beispiele

Einfaches Schreiben in eine Datei mit dio_write

<?php
// Datei zum Schreiben öffnen (O_RDWR | O_CREAT = 2 | 64 = 66)
$fd = dio_open('/tmp/test_dio.txt', O_RDWR | O_CREAT | O_TRUNC, 0644);

if ($fd === false) {
    die('Fehler beim Öffnen der Datei.');
}

$data = "Hallo von Direct I/O!\n";
$geschrieben = dio_write($fd, $data);

echo "Geschriebene Bytes: " . $geschrieben . PHP_EOL;

dio_close($fd);
?>
Geschriebene Bytes: 22

Nur einen Teil des Strings schreiben (len-Parameter)

<?php
$fd = dio_open('/tmp/test_dio_partial.txt', O_RDWR | O_CREAT | O_TRUNC, 0644);

if ($fd === false) {
    die('Fehler beim Öffnen der Datei.');
}

$data = "ABCDEFGHIJKLMNOP";

// Nur die ersten 5 Bytes schreiben
$geschrieben = dio_write($fd, $data, 5);

echo "Geschriebene Bytes: " . $geschrieben . PHP_EOL;
// Inhalt der Datei: "ABCDE"

dio_close($fd);
?>
Geschriebene Bytes: 5

Schreiben auf eine serielle Schnittstelle

<?php
// Typisches Szenario: Befehl an ein serielles Gerät senden
$fd = dio_open('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK);

if ($fd === false) {
    die('Serielle Schnittstelle konnte nicht geöffnet werden.');
}

// Gerätekonfiguration setzen
dio_tcsetattr($fd, [
    'baud'   => 9600,
    'bits'   => 8,
    'stop'   => 1,
    'parity' => 0
]);

$befehl = "AT\r\n"; // AT-Kommando
$result = dio_write($fd, $befehl);

if ($result === false) {
    echo "Fehler beim Schreiben auf die serielle Schnittstelle." . PHP_EOL;
} else {
    echo "Befehl gesendet, Bytes: " . $result . PHP_EOL;
}

dio_close($fd);
?>
Befehl gesendet, Bytes: 4

// Wichtig · Fallstricke

Erweiterungsverfügbarkeit: Die dio-Erweiterung ist nicht im PHP-Kernumfang enthalten. Sie muss entweder beim Kompilieren mit --enable-dio aktiviert oder als PECL-Paket installiert werden (pecl install dio). Prüfe mit extension_loaded('dio'), ob die Erweiterung verfügbar ist.

Plattformunterstützung: dio_write() ist primär für Unix/Linux-Systeme konzipiert. Auf Windows-Systemen ist die Funktionalität eingeschränkt oder gar nicht verfügbar.

Kein Puffering: Da Direct I/O den PHP-Stream-Layer umgeht, stehen Stream-Filter, Stream-Wrapper und ähnliche Mechanismen nicht zur Verfügung. Für normale Dateioperationen sollte fwrite() bevorzugt werden.

Rückgabewert: Der Rückgabewert ist ein String (nicht int), was bei strengen Typvergleichen zu beachten ist.