php:// — Zugriff auf verschiedene I/O-Streams
PHP stellt eine Reihe verschiedener I/O-Streams zur Verfügung. Diese ermöglichen den Zugriff auf PHP-eigene Ein- und Ausgabestreams, Dateideskriptoren für Standardeingabe, -ausgabe und -fehler, temporäre Dateistreams im Speicher und auf der Festplatte sowie Filter, die andere Dateiressourcen während des Lesen und Schreibens manipulieren können.
php://stdin, php://stdout und
php://stderr ermöglichen den direkten Zugriff auf den
entsprechenden Ein- oder Ausgabestream des PHP-Prozesses. Der Stream
verweist auf eine Kopie eines Dateideskriptors, d. h. wenn
php://stdin geöffnet und später wieder geschlossen
wird, wird nur die Kopie des Deskriptors geschlossen - der eigentliche
Stream, auf den STDIN verweist, bleibt davon
unberührt. Es wird empfohlen, einfach die Konstanten
STDIN, STDOUT und
STDERR zu verwenden, anstatt die Streams manuell mit
diesen Wrappern zu öffnen.
php://stdin ist schreibgeschützt, während php://stdout und php://stderr nur geschrieben werden können.
php://input ist ein schreibgeschützter Stream, mit dem
Rohdaten aus dem Body der Anfrage gelesen werden können. Wenn die Option
enable_post_data_reading
aktiviert ist, stehtphp://input in POST-Anfragen mit
enctype="multipart/form-data" nicht zur Verfügung.
php://output ist ein nur schreibbarer Stream, mit dem auf die gleiche Weise in den Ausgabepuffer geschrieben werden kann wie mit print und echo.
Mit php://fd kann direkt auf den angegebenen Dateideskriptor zugegriffen werden; z. B. verweist php://fd/3 auf den Dateideskriptor 3.
php://memory und php://temp sind les- und schreibbare Streams, mit denen temporäre Daten in einem dateiähnlichen Wrapper gespeichert werden können. Ein Unterschied zwischen den beiden besteht darin, dass php://memory die Daten immer im Speicher ablegt, während php://temp eine temporäre Datei verwendet, sobald die Menge der gespeicherten Daten eine vordefinierte Grenze (der Standardwert ist 2 MB) erreicht. Der Speicherort dieser temporären Datei wird auf die gleiche Weise ermittelt, wie bei der Funktion sys_get_temp_dir().
Das Speicherlimit von php://temp kann durch Anhängen
von /maxmemory:NN festgelegt werden, wobei
NNN die maximale Datenmenge in Bytes ist, die im
Speicher gehalten werden soll, bevor eine temporäre Datei verwendet wird.
Manche PHP-Erweiterungen benötigen einen Standard-IO-Stream und versuchen, einen gegebenen Stream in einen Standard-IO-Stream umzuwandeln. Diese Umwandlung kann bei Speicher-Streams fehlschlagen, da hierfür die C-Funktion fopencookie() verfügbar sein muss. Unter Windows steht diese C-Funktion nicht zur Verfügung.
php://filter ist eine Art Meta-Wrapper, mit dem Filter auf einen Stream angewendet werden können, wenn dieser geöffnet wird. Dies ist nützlich bei All-in-One-Dateifunktionen wie readfile(), file() und file_get_contents(), wo es sonst keine Möglichkeit gibt, einen Filter auf den Stream anzuwenden, bevor der Inhalt gelesen wird.
Der Wrapper php://filter akzeptiert die folgenden Parameter als Teil seines Pfades. Es können mehrere Filterketten in einem Pfad angegeben werden. Einzelheiten zur Verwendung dieser Parameter werden in den Beispielen erläutert.
| Name | Beschreibung |
|---|---|
resource=<zu filternder Stream>
|
Dieser Parameter ist erforderlich; er gibt den Stream an, der gefiltert werden soll. |
read=<Liste der Filter, die auf den Lese-Stream angewendet werden sollen>
|
Dieser Parameter ist optional; ein oder mehrere Filternamen, getrennt
durch ein Pipe-Zeichen (|).
|
write=<Liste der Filter, die auf den Schreib-Stream angewendet werden sollen>
|
Dieser Parameter ist optional; ein oder mehrere Filternamen, getrennt
durch ein Pipe-Zeichen (|).
|
<Liste der Filter, die auf beide Streams angewendet werden sollen>
|
Alle Filterlisten, denen kein read= oder
write= vorangestellt ist, werden je nach Bedarf
sowohl auf den Lese- als auch auf den Schreib-Stream angewendet.
|
Beispiel #1 php://temp/maxmemory
Mit diesem optionalen Parameter kann festgelegt werden, wie viel Speicherplatz php://temp verwenden darf, bevor eine temporäre Datei verwendet wird.
<?php
// Das Limit auf 5 MB setzen.
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
fputs($fp, "hello\n");
// Lesen, was geschrieben wurde.
rewind($fp);
echo stream_get_contents($fp);
?>Beispiel #2 php://filter/resource=<zu filternder Stream>
Dieser Parameter muss sich am Ende der php://filter-Spezifikation befinden und auf den Stream verweisen, der gefiltert werden soll.
<?php
/* Da keine Filter angegeben werden, entspricht dies einem einfachen
readfile("http://www.example.com"); */
readfile("php://filter/resource=http://www.example.com");
?>Beispiel #3 php://filter/read=<Liste der Filter, die auf den Lese-Stream angewendet werden sollen>
Dieser Parameter akzeptiert einen oder mehrere Filternamen, die durch das
Pipe-Zeichen | getrennt sind.
<?php
/* Dies gibt den Inhalt von www.example.com
komplett in Großbuchstaben aus */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* Dies bewirkt dasselbe wie oben,
aber zusätzlich wird ROT13-kodiert */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>Beispiel #4 php://filter/write=<Liste der Filter, die auf den Schreib-Stream angewendet werden sollen>
Dieser Parameter akzeptiert einen oder mehrere Filternamen, die durch das
Pipe-Zeichen | getrennt sind.
<?php
/* Dies wendet einen rot13-Filter auf die Zeichenkette
"Hello World" an und schreibt sie dann in die Datei
example.txt im aktuellen Verzeichnis */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>Beispiel #5 php://memory und php://temp sind nicht wiederverwendbar
php://memory und php://temp können nicht wiederverwendet werden, d. h. nachdem die Streams geschlossen wurden, kann nicht mehr auf sie zugegriffen werden.
<?php
file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // gibt nichts ausBeispiel #6 JSON-Daten mittels php://input aus dem Body einer Anfrage lesen
Dieses Beispiel zeigt, wie mittels php://input JSON-Rohdaten aus POST-, PUT- und PATCH-Anfragen gelesen werden können.
<?php
$input = file_get_contents("php://input");
$json_array = json_decode(
json: $input,
associative: true,
flags: JSON_THROW_ON_ERROR
);
echo "Empfangene JSON-Daten: ";
print_r($json_array);
?>