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 php://stdin
est ouvert puis fermé plus tard, seule la copie du descripteur est fermée ; 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 nécessiter 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évue 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. Se reporter 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 à 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 la spécification de php://filter et doit pointer sur le flux à 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.
<?php
file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // affiche rienExemple #6 php://input pour lire des données JSON depuis le corps de la requête
Cet exemple montre comment lire des données JSON brutes à partir des requêtes POST, PUT et PATCH en utilisant php://input.
<?php
$input = file_get_contents("php://input");
$json_array = json_decode(
json: $input,
associative: true,
flags: JSON_THROW_ON_ERROR
);
echo "Données JSON reçues : ";
print_r($json_array);
?>