Les flux ("streams" en anglais) ont été introduits en PHP 4.3.0
comme méthode de généralisation des fichiers, sockets, connexions
réseau, données compressées et autres opérations du même type,
qui partagent des opérations communes. Dans sa définition la plus simple,
un flux est une ressource qui
présente des capacités de flux :
c'est-Ã -dire que ces objets peuvent être lus ou recevoir des
écritures de manière linéaire, et dispose aussi de moyen d'accéder
à des positions arbitraires dans le flux.
Un gestionnaire (dit wrapper en anglais), est une
fonction qui indique comment le flux se comporte spécifiquement. C'est le
cas du gestionnaire http, qui sait comment traduire
une URL en une requête HTTP/1.0 sur un serveur distant.
Il existe de nombreux gestionnaires intégrés à PHP
par défaut (voir Annexe M),
et, de plus, des gestionnaires spécifiques peuvent être ajoutés dans
les scripts PHP avec la fonction stream_register_wrapper(),
ou bien directement par une autre extension, en utilisant l'API C de Chapitre 44.
Grâce à la souplesse des gestionnaires qui peuvent être ajoutés à PHP,
il n'y a pas de limites aux possibilités offertes. Pour connaître la liste
des gestionnaires actuellement enregistrés, utilisez la fonction
stream_get_wrappers().
Un flux est référencé comme :
scheme://target
scheme(chaîne de caractères) -
Le nom du gestionnaire a utiliser. Par exemple, file, http, https,
ftp, ftps, compress.zlib, compress.bz. et php..
Voir Annexe M
pour une liste complète des gestionnaires enregistrés de PHP.
Si aucun gestionnaire n'est spécifié, la fonction par défaut est utilisée (typiquement,
file://).
target -
Dépend du gestionnaire utilisé. Pour les flux relatifs aux systèmes de fichiers, c'est
typiquement un chemin et un nom de fichier du fichier désiré.
Pour les flux relatifs aux réseaux, c'est typiquement le nom d'hôte,
souvent avec un chemin apposé. Voir aussi Annexe M
pour une description des cibles des flux intégrés.
Un filtre est une fonction finale qui effectue des opérations
sur les données qui sont lues ou écrites dans un flux. Un nombre arbitraire de
filtres peuvent être ajoutés sur un flux. Des filtres personnalisés peuvent aussi
être ajoutés avec la fonction stream_register_filter(), ou bien
dans une extension avec l'API C de Chapitre 44. Pour connaître la liste
des gestionnaires actuellement enregistrés, utilisez la fonction
stream_get_filters().
Un contexte est un jeu de paramètres et d'options
spécifiques à un gestionnaire qui modifie ou améliore le comportement
d'un flux. Les contextes sont créés en utilisant la fonction
stream_context_create() et peuvent être donnés aux
fonctions de création de flux sur le système de fichiers
(i.e. fopen(), file(),
file_get_contents(), etc.).
Les options peuvent être spécifiées en appelant
stream_context_create() ou, plus tard, avec
stream_context_set_option().
Une liste des options spécifiques à des gestionnaires est disponible
dans la liste des gestionnaires intégrés (voyez Annexe M).
De plus, les paramètres peuvent être envoyés à un contexte en utilisant
la fonction stream_context_set_params(). Actuellement, le
seul paramètre de contexte supporté par PHP est notification.
La valeur de ce paramètre doit être le nom d'une fonction qui sera appelée
lorsqu'un événement survient pour un flux. La fonction d'alerte
est appelée durant la réception de l'événement, et doit accepter 6 paramètres :
void my_notifier ( int notification_code, int severity, string message, int message_code, int bytes_transferred, int bytes_max )
notification_code et severity
sont des valeurs numériques qui correspondent aux constantes
STREAM_NOTIFY_* listées ci-dessous.
Si un message descriptif est disponible dans un flux, les
paramètres message et message_code
en seront équipés. La signification de ces valeurs est dépendante du gestionnaire.
bytes_transferred et bytes_max seront
fournies si possible.
Des gestionnaires personnalisés peuvent être enregistrés via la fonction
stream_register_wrapper(), en utilisant la définition de
classe décrite dans ce manuel.
La classe php_user_filter est prédéfinie. C'est une classe abstraite
à utiliser avec les filtres personnalisés. Voyez le manuel de la fonction
stream_register_filter() pour plus de détails sur les
implémentations de filtres utilisateurs.
Ces constantes sont définies par cette
extension, et ne sont disponibles que si cette extension a été compilée avec
PHP, ou bien chargée au moment de l'exécution.
Cette constante est équivalente Ã
STREAM_FILTER_READ |
STREAM_FILTER_WRITE
PSFS_PASS_ON *
Le code retourné indique que le filtre utilisateur retourne
des données dans $out.
PSFS_FEED_ME *
Le code retourné indique que le filtre utilisateur ne retourne
pas de données dans $out
(i.e. Aucune donnée disponible).
PSFS_ERR_FATAL *
Le code retourné indique que le filtre utilisateur
a produit une erreur fatale.
(i.e. Données invalides reçues).
STREAM_USE_PATH
Option indiquant si stream
a utilisé l'include_path.
STREAM_REPORT_ERRORS
Option indiquant si le gestionnaire est responsable
pour la levée des erreurs avec trigger_error()
durant l'ouverture du flux. Si cette constante n'existe pas,
vous ne devez pas émettre d'erreurs.
STREAM_CLIENT_ASYNC_CONNECT *
Ouvre un socket client en mode asynchrone. Cette option doit être utilisée
avec le flag STREAM_CLIENT_CONNECT.
À utiliser avec la fonction stream_socket_client().
STREAM_CLIENT_CONNECT *
Ouvre un socket client. Les sockets clients doivent toujours inclure ce flag.
À utiliser avec la fonction stream_socket_client().
STREAM_CLIENT_PERSISTENT *
Le socket client ouvert avec stream_socket_client()
doit rester persistant entre chaque page chargée.
STREAM_SERVER_BIND *
Appel un flux créé avec la fonction stream_socket_server()
pour s'identifier sur la cible définie. Les sockets serveur doivent toujours utiliser
cette constante.
STREAM_SERVER_LISTEN *
Appel un flux créé avec stream_socket_server()
et utilise la constante STREAM_SERVER_BIND pour commencer
à écouter la socket. Les connexions orientées transports (comme TCP) doivent utiliser
ce flag sinon la socket serveur ne sera pas activé.
Utiliser ce flag pour les connexions basses de transports (comme UDP) est une erreur.
STREAM_NOTIFY_RESOLVE *
Une adresse distante requise pour ce flux a été résolue, ou bien la résolution a échoué.
Voir le paramètre severity pour avoir une indication
sur l'événement survenu.
STREAM_NOTIFY_CONNECT
Une connexion avec une ressource externe a été établie.
STREAM_NOTIFY_AUTH_REQUIRED
Une autorisation supplémentaire est demandée pour accéder à la ressource spécifiée.
Typiquement utilisé avec le niveau d'alerte severity de la constante
STREAM_NOTIFY_SEVERITY_ERR.
STREAM_NOTIFY_MIME_TYPE_IS
Le type mime de la ressource a été identifié : voir
le paramètre message pour une description
du type découvert.
STREAM_NOTIFY_FILE_SIZE_IS
La taille de la ressource a été découverte.
STREAM_NOTIFY_REDIRECTED
La ressource externe a redirigé le flux vers un endroit différent.
Voir le paramètre message.
STREAM_NOTIFY_PROGRESS
Indique l'actuelle progression du transfert du flux dans
bytes_transferred et peut-être
bytes_max également.
STREAM_NOTIFY_COMPLETED *
Il n'y a plus de données disponibles sur le flux.
STREAM_NOTIFY_FAILURE
Une erreur générique est intervenue sur le flux, consultez les paramètres
message et message_code
pour plus de détails.
STREAM_NOTIFY_AUTH_RESULT
L'autorisation est terminée (avec succès ou pas).
STREAM_NOTIFY_SEVERITY_INFO
Notification normale, aucune erreur signalée.
STREAM_NOTIFY_SEVERITY_WARN
Erreur non critique. Le traitement continue.
STREAM_NOTIFY_SEVERITY_ERR
Une erreur critique est survenu. Le traitement ne peut continuer.
STREAM_IPPROTO_ICMP +
Fournit un socket ICMP.
STREAM_IPPROTO_IP +
Fournit un socket IP.
STREAM_IPPROTO_RAW +
Fournit un socket RAW.
STREAM_IPPROTO_TCP +
Fournit un socket TCP.
STREAM_IPPROTO_UDP +
Fournit un socket UDP.
STREAM_PF_INET +
Protocole Internet version 4 (IPv4).
STREAM_PF_INET6 +
Protocole internet version 6(IPv6).
STREAM_PF_UNIX +
Protocoles internes des systèmes Unix.
STREAM_SOCK_DGRAM +
Fournit des datagrammes, qui sont des messages de connexion (UDP, par
exemple).
STREAM_SOCK_RAW +
Fournit un socket raw, qui fournit un accès aux protocoles et interfaces internes
du réseau. Habituellement, ce type de socket n'est disponible qu'Ã l'utilisateur root.
STREAM_SOCK_RDM +
Fournit un socket RDM (Reliably-delivered messages).
STREAM_SOCK_SEQPACKET +
Fournit un socket de flux de paquets séquencés.
STREAM_SOCK_STREAM +
Fournit un flux séquencé, deux chemins avec un mécanisme de transmission
pour les données "out-of-band" (TCP par exemple).
Note :
Les constantes marquées avec une *
sont uniquement disponibles depuis PHP 5.0.0.
Note :
Les constantes marquées avec une + sont disponibles
depuis PHP 5.1.0 et sont faites pour être utilisées avec la fonction
stream_socket_pair(). Notez que quelques-unes de ces constantes
peuvent ne pas être disponibles sur votre système.
Comme avec n'importe quel fichier ou socket, les opérations sur un flux
peuvent échouer pour une grande variété de raisons (par exemple : impossible
de se connecter au serveur distant, fichier introuvable, etc.). Un flux peut aussi
échouer parce que le gestionnaire n'est pas configuré sur le système en
cours. Voyez le tableau retourné par la fonction
stream_get_wrappers() pour connaître la liste des gestionnaires
configurés sur votre installation de PHP. Comme avec la plupart des fonctions
internes de PHP, si une erreur survient, un message de type
E_WARNING sera généré pour indiquer la nature
de l'erreur.
<?php /* Lit un fichier local dans le dossier /home/bar */ $localfile = file_get_contents("/home/bar/foo.txt");
/* Identique au précédent, mais utilise explicitement le gestionnaire FILE */ $localfile = file_get_contents("file:///home/bar/foo.txt");
/* Lit un fichier distant sur le serveur www.example.com avec le protocole HTTP */ $httpfile = file_get_contents("http://www.example.com/foo.txt");
/* Lit le même fichier sur le serveur www.example.com avec le protocole HTTPS */ $httpsfile = file_get_contents("https://www.example.com/foo.txt");
/* Lit un fichier distant sur le serveur ftp.example.com en utilisant le protocole FTP */ $ftpfile = file_get_contents("ftp://user:pass@ftp.example.com/foo.txt");
/* Lit un fichier distant sur le serveur ftp.example.com en utilisant le protocole FTPS */ $ftpsfile = file_get_contents("ftps://user:pass@ftp.example.com/foo.txt"); ?>
Exemple 2. Envoi d'une requête de type POST sur un serveur sécurisé
<?php /* Envoi d'une requête POST sur le serveur https://secure.example.com/form_action.php * Inclusion des variables "foo" et "bar" */
Exemple 3. Ecrire des données dans un fichier compressé
<?php /* Création d'un fichier compressé contenant une chaîne arbitraire * Le fichier peut être lu en utilisant le gestionnaire compress.zlib * ou simplement decompresse; en ligne de commande avec 'gzip -d foo-bar.txt.gz' */ $fp = fopen("compress.zlib://foo-bar.txt.gz","w"); if (!$fp) die("Impossible de créer le fichier.");