W3docs

PHP Stream

Streams sind eine leistungsstarke PHP-Funktion zum Lesen und Schreiben von Daten aus verschiedenen Quellen wie Dateien, Sockets und HTTP-Anfragen.

PHP Streams

Ein Stream in PHP ist eine allgemeine Methode, um Daten aus einem Datenfluss zu lesen oder darin zu schreiben, unabhängig davon, wo sich diese Daten befinden. Eine Datei auf dem Datenträger, ein Speicherpuffer, ein Netzwerk-Socket und der Body einer HTTP-Antwort sind sehr unterschiedliche Dinge – dennoch ermöglicht PHP, all diese mit dem gleichen Satz an Funktionen zu verarbeiten. Diese Einheitlichkeit ist der eigentliche Zweck: Wenn Sie wissen, wie man mit fopen()/fgets() eine Datei liest, wissen Sie bereits, wie man eine Webseite oder einen Speicherpuffer liest.

Diese Seite erklärt, was Streams sind, welche Funktionen sie antreiben, welche Wrapper die Quelle eines Streams bestimmen und wie man sicher mit ihnen arbeitet.

Welches Problem lösen Streams?

Ohne Streams bräuchten Sie für jede Datenquelle eine eigene API – eine für Dateien, eine für HTTP, eine für Sockets. Streams bieten eine einheitliche Abstraktion:

  • Wrapper – ein Präfix wie file://, php://, http:// oder php://memory, das PHP mitteilt, welche Art von Ressource angesprochen wird.
  • Ressource-Handle – der von fopen() zurückgegebene Wert; er wird an jede weitere Stream-Funktion übergeben.
  • Filter und Kontexte – optionale Schichten, die Daten transformieren (z. B. gzip) oder die Verbindung konfigurieren (z. B. HTTP-Header, Timeouts).

Durch dieses Design können Sie einen lokalen Pfad durch eine Remote-URL ersetzen und der Großteil Ihres Codes bleibt unverändert.

Grundlegende Stream-Funktionen

Diese Funktionen bilden das Rückgrat der Streams API:

FunktionWas sie tut
fopen($target, $mode)Öffnet eine Datei oder URL und gibt eine Stream-Ressource zurück (oder false bei Fehler).
fread($handle, $length)Liest bis zu $length Bytes.
fgets($handle)Liest eine Zeile.
fwrite($handle, $string)Schreibt einen string und gibt die Anzahl der geschriebenen Bytes zurück.
feof($handle)Gibt true zurück, sobald das Ende des Streams erreicht ist.
fclose($handle)Gibt die Stream-Ressource frei.

Der $mode steuert den Zugriff: 'r' (lesen), 'w' (schreiben, abschneiden), 'a' (anhängen) und die '+'-Varianten für lesen und schreiben.

Für einzelne Lese- und Schreibvorgänge müssen Sie in der Regel gar kein Handle verwalten – die High-Level-Helfer file_get_contents() und file_put_contents() öffnen, übertragen und schließen einen Stream in einem einzigen Aufruf.

Stream-Wrapper und -Typen

Der Wrapper am Anfang des Ziel-Strings bestimmt den Typ des Streams:

  • Datei-Streams (file:// oder ein einfacher Pfad) – lesen und schreiben Daten im Dateisystem. Siehe PHP File Handling und Open and Read a File.
  • Speicher-Streams (php://memory, php://temp) – ein Lese-/Schreib-Puffer im RAM; ideal zum Aufbau von Daten in Tests ohne Festplattenzugriff.
  • I/O-Streams (php://stdin, php://stdout, php://input) – Standard-Ein-/Ausgabe und der rohe Request-Body.
  • Netzwerk-/Socket-Streams (tcp://, ssl://) – lesen und schreiben über eine Netzwerkverbindung.
  • HTTP/FTP-Streams (http://, https://, ftp://) – rufen Remote-Dokumente ab, als wären sie Dateien (erfordert, dass allow_url_fopen aktiviert ist).

Eine Datei zeilenweise lesen

Dieses einfache, in sich geschlossene Beispiel schreibt eine kleine Datei, liest sie über einen Stream Zeile für Zeile zurück und räumt anschließend auf:

<?php

$path = sys_get_temp_dir() . '/stream-demo.txt';

// Write three lines using the high-level helper.
file_put_contents($path, "alpha\nbeta\ngamma\n");

// Read them back through a stream handle.
$handle = fopen($path, 'r');
if ($handle === false) {
    exit("Could not open the stream.\n");
}

while (!feof($handle)) {
    $line = fgets($handle);
    if ($line !== false) {
        echo "Line: " . trim($line) . PHP_EOL;
    }
}

fclose($handle);
unlink($path);

Ausgabe:

Line: alpha
Line: beta
Line: gamma

Wir öffnen die Datei im Lesemodus, iterieren bis feof() das Ende meldet, und lesen jede Zeile mit fgets(). Prüfen Sie immer, ob fopen() nicht false zurückgegeben hat, bevor Sie das Handle verwenden, und rufen Sie fclose() auf, wenn Sie fertig sind.

Einen Speicher-Stream verwenden

Speicher-Streams verhalten sich wie Dateien, schreiben aber nie auf die Festplatte – nützlich zum Zusammenstellen von Ausgaben oder in Unit-Tests:

<?php

$handle = fopen('php://memory', 'r+');

fwrite($handle, "buffered data");

// Rewind to the start before reading what we wrote.
rewind($handle);

echo fread($handle, 1024);

fclose($handle);

Ausgabe:

buffered data

Nach dem Schreiben müssen Sie den Zeiger mit rewind() an den Anfang zurücksetzen, bevor Sie lesen, da sich die interne Position am Ende des zuletzt Geschriebenen befindet.

Einen Remote-Stream lesen

Da HTTP nur ein weiterer Wrapper ist, funktioniert dieselbe Schleife auch gegen eine URL, wenn allow_url_fopen aktiviert ist:

<?php

$handle = fopen('https://www.example.com', 'r');
if ($handle === false) {
    exit("Failed to open the remote stream.\n");
}

while (!feof($handle)) {
    echo fgets($handle);
}

fclose($handle);

Dieses Beispiel benötigt Netzwerkzugriff und die aktivierte Einstellung allow_url_fopen, sodass es in einer Offline-Sandbox nicht ausgeführt werden kann. Für echte Anwendungen bietet ein dedizierter HTTP-Client wie cURL bessere Kontrolle über Header, Timeouts und Fehler.

Fehlerbehandlung

Stream-Funktionen signalisieren Fehler durch Rückgabe von false statt durch Ausnahmen – daher sollte jeder Aufruf abgesichert werden:

  • Prüfen Sie den Rückgabewert von fopen(), bevor Sie lesen oder schreiben.
  • Umschließen Sie riskante Operationen mit try/catch, wenn Sie Warnungen in Ausnahmen umwandeln – siehe PHP Exceptions.
  • Schließen Sie immer alle geöffneten Handles mit fclose(), um Ressourcen freizugeben.

Fazit

Streams bieten PHP eine einheitliche, konsistente Schnittstelle für jeden Typ von Datenfluss – Dateien, Speicherpuffer, Sockets und HTTP-Antworten. Lernen Sie den kleinen Satz an Kernfunktionen (fopen, fread/fgets, fwrite, feof, fclose), verstehen Sie Wrapper wie file:// und php://memory, und nutzen Sie für einfache Fälle die High-Level-Helfer file_get_contents()/file_put_contents(). Erkunden Sie außerdem Erstellen und Schreiben von Dateien und die korrekte Fehlerbehandlung.

Übung

Übung
Wofür können PHP Streams verwendet werden?
Wofür können PHP Streams verwendet werden?
Was this page helpful?