php:// — Accès aux divers flux I/O
PHP fournit un nombre important de flux I/O qui permettent d'accéder aux flux d'entrée et de sortie de PHP lui-même, aux descripteurs de fichiers d'entrée, de sortie et d'erreur standards, à des flux représentant des fichiers temporaires en mémoire vive ou sur le disque, ainsi qu'à des filtres qui peuvent manipuler d'autres ressources de fichiers pendant la lecture ou l'écriture.
php://stdin, php://stdout et
php://stderr permettent des accès directs aux flux d'entrée
ou de sortie correspondant du processus PHP. Le flux fait référence à une copie
du descripteur de fichier, ce qui signifie que si vous ouvrez php://stdin
et le fermez plus tard, vous ne fermez que votre copie du descripteur ; le
flux réellement référencé par STDIN
n'est pas affecté.
Il est recommandé d'utiliser uniquement les constantes STDIN
,
STDOUT
et STDERR
au lieu
d'ouvrir manuellement les flux en utilisant ces enveloppes.
php://stdin est en lecture seule, alors que php://stdout et php://stderr sont en écriture seule.
php://input est un flux en lecture seule qui permet
de lire des données brutes depuis le corps de la requête.
php://input n'est pas disponible dans les requêtes POST avec
enctype="multipart/form-data"
si l'option
enable_post_data_reading
est activée.
php://output est un flux en écriture seule, qui permet d'écrire dans le mécanisme de buffer de sortie de la même façon que les fonctions print et echo.
php://fd permet un accès direct au descripteur de fichier spécifié. Par exemple, php://fd/3 correspond au descripteur de fichier numéro 3.
php://memory et php://temp sont des flux en lecture/écriture qui permettent de stocker des données temporaires dans une enveloppe de fichiers. Une différence entre ces deux flux est que php://memory stockera toujours ses données en mémoire, alors que php://temp utilisera un fichier temporaire une fois que la quantité de données enregistrées aura dépassé une limite prédéfinie (par défaut, 2 Mo). L'emplacement de ce fichier temporaire est déterminé de la même manière que pour la fonction sys_get_temp_dir().
La limite mémoire de php://temp peut être contrôlée
en ajoutant /maxmemory:NN
, où NN
est
la quantité maximale de données à conserver en mémoire avant d'utiliser
un fichier temporaire, en octets.
Certaines extensions PHP peuvent require un flux IO standard, et peuvent tenter de convertir un flux donné à un flux IO standard. Cette conversion peut échouer pour les flux de mémoire, car la fonction C fopencookie() doit être disponible. Cette fonction C n'est pas disponible sur Windows.
php://filter est une sorte d'enveloppe prévu pour permettre l'application de filtres sur un flux au moment de son ouverture. Ceci est très pratique avec des fonctions sur des fichiers toutes-en-un comme les fonctions readfile(), file() et file_get_contents(), où il n'existe pas d'autre mécanisme permettant d'appliquer un filtre au flux avant que le contenu ne soit lu.
La cible de php://filter prend les paramètres suivants sous la forme de composantes de son chemin. Plusieurs filtres chaînés peuvent être spécifiés en un seul chemin. Reportez-vous aux exemples pour une utilisation correcte de ces paramètres.
Nom | Description |
---|---|
resource=<flux à filtrer>
|
Ce paramètre est requis. Il spécifie le flux que vous souhaitez filtrer. |
read=<liste des filtres à appliquer à la lecture>
|
Ce paramètre est optionnel. Un ou plusieurs noms de filtres
peuvent être fournis ici, séparés par un caractère pipe (| ).
|
write=<liste des filtres à appliquer à l'écriture>
|
Ce paramètre est optionnel. Un ou plusieurs noms de filtres
peuvent être fournis ici, séparés par un caractère pipe (| ).
|
<liste de filtre à appliquer à la fois lors de la lecture et de l'écriture>
|
Tous les filtres fournis sans être préfixés par read=
ou write= seront appliqués à la fois lors de la
lecture et lors de l'écriture.
|
Exemple #1 php://temp/maxmemory
Ce paramètre optionnel permet de configurer la limite mémoire avant que php://temp ne commence à utiliser un fichier temporaire.
<?php
// Définit la limite à 5 Mo.
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
fputs($fp, "hello\n");
// Lit ce que nous venons d'écrire.
rewind($fp);
echo stream_get_contents($fp);
?>
Exemple #2 php://filter/resource=<flux à filtrer>
Ce paramètre doit être placé à la fin de votre spécification de php://filter et doit pointer sur le flux que vous souhaitez filtrer.
<?php
/* Ceci est équivalent à
readfile("http://www.example.com");
vu qu'aucun filtre n'est spécifié */
readfile("php://filter/resource=http://www.example.com");
?>
Exemple #3 php://filter/read=<liste de filtres à appliquer lors de la lecture>
Ce paramètre prend un ou plusieurs noms de filtres séparés par
un caractère pipe |
.
<?php
/* Ceci affichera le contenu de
www.example.com entièrement en majuscules */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* Ceci fera la même chose que le précédent,
mais encodera en plus le résultat en ROT13 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>
Exemple #4 php://filter/write=<liste des filtres à appliquer lors de l'écriture>
Ce paramètre prend un ou plusieurs noms de filtres séparés par
un caractère pipe |
.
<?php
/* Ceci va filtrer la chaîne "Hello World"
via le filtre rot13, puis écrire le résultat
dans le fichier example.txt du dossier courant */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>
Exemple #5 php://memory et php://temp ne sont pas réutilisables
php://memory et php://temp ne sont pas réutilisables, c.-à-d. après que les flux ont été fermés il n'y a aucun moyen de les référer à nouveau.
file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // affiche rien