Signatur
Beschreibung
stream_filter_prepend() fügt einen benannten Stream-Filter an den Beginn der Filterkette eines geöffneten Streams ein. Im Gegensatz zu stream_filter_append(), das den Filter ans Ende der Kette hängt, wird der mit stream_filter_prepend() hinzugefügte Filter als erster ausgeführt, wenn Daten den Stream durchlaufen. Das ist wichtig, wenn die Reihenfolge der Filterverarbeitung (z. B. erst komprimieren, dann verschlüsseln) eine Rolle spielt.
Der Parameter read_write steuert, ob der Filter auf den Lesepuffer (STREAM_FILTER_READ), den Schreibpuffer (STREAM_FILTER_WRITE) oder auf beide (STREAM_FILTER_ALL) angewendet wird. Wird kein Wert angegeben, richtet sich das Standardverhalten nach dem Öffnungsmodus des Streams.
Typische Einsatzszenarien sind das transparente De-/Komprimieren von Daten (z. B. mit zlib.inflate oder bzip2.decompress), die Zeichensatz-Konvertierung (convert.iconv.*) oder das Bereinigen von Eingaben (string.strip_tags). Die Funktion gibt eine Ressource zurück, über die der Filter später mit stream_filter_remove() wieder entfernt werden kann.
Verfügbare Filter lassen sich mit stream_get_filters() abfragen. Eigene Filter können über stream_filter_register() registriert werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $stream Pflicht | resource | Ein geöffneter Stream, an den der Filter gehängt werden soll (z. B. Rückgabewert von fopen()). |
|
| $filtername Pflicht | string | Name des anzuhängenden Filters, z. B. 'zlib.inflate', 'string.toupper' oder 'convert.iconv.UTF-8/ISO-8859-1'. Alle verfügbaren Filter liefert stream_get_filters(). |
|
| $read_write | int | STREAM_FILTER_READ | Bestimmt, auf welche Richtung der Filter angewendet wird: STREAM_FILTER_READ, STREAM_FILTER_WRITE oder STREAM_FILTER_ALL. |
| $params | mixed | null | Optionale Parameter, die an den Filter übergeben werden. Kann ein skalarer Wert, ein Array oder null sein. Die Interpretation obliegt dem jeweiligen Filter. |
Rückgabewert
stream_filter_remove() übergeben werden kann. Bei einem Fehler (z. B. unbekannter Filtername) wird false zurückgegeben.Beispiele
Großbuchstaben-Filter an Lese-Stream voranstellen
<?php
// Temporären Stream erzeugen und Text hineinschreiben
$stream = fopen('php://temp', 'r+');
fwrite($stream, 'Hallo Welt');
rewind($stream);
// Filter an den Anfang der Lesekette hängen
$filter = stream_filter_prepend($stream, 'string.toupper', STREAM_FILTER_READ);
// Gefilterten Inhalt lesen
echo stream_get_contents($stream); // Ausgabe: HALLO WELT
// Filter wieder entfernen
stream_filter_remove($filter);
fclose($stream);
zlib-Kompression beim Schreiben voranstellen
<?php
// Datei zum Schreiben öffnen
$stream = fopen('output.zlib', 'wb');
// Kompressionsfilter an den Anfang der Schreib-Filterkette hängen
stream_filter_prepend($stream, 'zlib.deflate', STREAM_FILTER_WRITE, 6);
fwrite($stream, 'Das sind komprimierte Daten.');
fclose($stream);
// Datei wieder lesen und dekomprimieren
$in = fopen('output.zlib', 'rb');
stream_filter_prepend($in, 'zlib.inflate', STREAM_FILTER_READ);
echo stream_get_contents($in);
fclose($in);
Reihenfolge von prepend vs. append verstehen
<?php
$stream = fopen('php://temp', 'r+');
fwrite($stream, 'hello world');
rewind($stream);
// Erst append: string.toupper (kommt in der Kette an zweiter Stelle)
stream_filter_append($stream, 'string.toupper', STREAM_FILTER_READ);
// Dann prepend: string.rot13 (wird VOR toupper ausgeführt)
stream_filter_prepend($stream, 'string.rot13', STREAM_FILTER_READ);
// Reihenfolge: rot13 -> toupper
// 'hello world' -> rot13 -> 'uryyb jbeyq' -> toupper -> 'URYYB JBEYQ'
echo stream_get_contents($stream);
fclose($stream);
// Wichtig · Fallstricke
Filterreihenfolge: Werden mehrere Filter mit stream_filter_prepend() nacheinander registriert, wird der zuletzt vorangestellte Filter als erster ausgeführt. Die Reihenfolge der Filterausführung kann schwer nachzuvollziehen sein — ein Kommentar im Code ist empfehlenswert.
Unbekannte Filter: Wird ein nicht registrierter Filtername übergeben, gibt die Funktion false zurück und erzeugt eine PHP-Warnung. Mit stream_get_filters() lässt sich vorab prüfen, welche Filter verfügbar sind.
Sicherheit: Filter wie string.strip_tags oder convert.quoted-printable-decode sollten nicht als einzige Sicherheitsmaßnahme gegen XSS oder Injection eingesetzt werden. Sie ersetzen keine gezielte Validierung und Ausgabekodierung.