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 aus