(PHP 4, PHP 5, PHP 7, PHP 8)
fopen — Ouvre un fichier ou une URL
$filename,$mode,$use_include_path = false,$context = null
fopen() crée une ressource nommée, spécifiée par
le paramètre filename, sous la forme d'un flux.
filename
Si filename est de la forme "protocole://",
filename est supposé être une URL, et PHP va
rechercher un gestionnaire de protocole adapté pour lire ce fichier.
Si aucun gestionnaire pour ce protocole n'est disponible, PHP va émettre
une alerte qui permettra de savoir qu'il y a des problèmes dans
le script, et il tentera d'exploiter filename
comme un fichier classique.
Si PHP décide que le fichier filename est un fichier
local, il va essayer d'ouvrir un flux avec ce fichier. Le fichier doit être
accessible à PHP. Il faut donc s'assurer d'avoir les
droits d'accès à ce fichier. Si l'on active
la directive open_basedir, d'autres
conditions peuvent aussi s'appliquer.
Si PHP a décidé que filename spécifie
un protocole enregistré, et que ce protocole est enregistré comme
un protocole réseau, PHP s'assurera que la directive
allow_url_fopen est activée.
Si elle est inactive, PHP va émettre une alerte et l'appel fopen()
va échouer.
Note:
La liste des protocoles supportés est disponible sur Liste des protocoles et des gestionnaires supportés. Certains protocoles (appelés aussi
wrappersou gestionnaires) supportent descontextet/ou des options dans le fichier php.ini. Se référer aux pages du manuel traitant le protocole, pour connaître la liste des options qui sont disponibles (p. ex. l'option de php.iniuser_agentest utilisée par le gestionnairehttp).
Sous Windows, il faut s'assurer de bien protéger les antislashs utilisés dans le chemin du fichier, ou bien utiliser des slashs.
<?php
$handle = fopen("c:\\folder\\resource.txt", "r");
?>mode
Le paramètre mode spécifie le type d'accès désiré
au flux. Il peut prendre les valeurs suivantes :
mode |
Description |
|---|---|
'r' |
Ouvre en lecture seule et place le pointeur de fichier au début du fichier. |
'r+' |
Ouvre en lecture et écriture et place le pointeur de fichier au début du fichier. |
'w' |
Ouvre en écriture seule ; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer. |
'w+' |
Ouvre en lecture et écriture ; le comportement est
le même que pour 'w'.
|
'a' |
Ouvre en écriture seule ; place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, on tente de le créer. Dans ce mode, la fonction fseek() n'a aucun effet, les écritures surviennent toujours. |
'a+' |
Ouvre en lecture et écriture ; place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, on tente de le créer. Dans ce mode, la fonction fseek() n'affecte que la position de lecture, les écritures sont toujours ajoutées à la fin. |
'x' |
Crée et ouvre le fichier en écriture seulement ; place le pointeur de
fichier au début du fichier. Si le fichier existe déjà,
fopen() va échouer, en retournant false et
en générant une erreur de niveau E_WARNING.
Si le fichier n'existe pas, fopen() tente de le
créer. Ce mode est l'équivalent des options O_EXCL|O_CREAT
pour l'appel système open(2) sous-jacent.
|
'x+' |
Crée et ouvre le fichier pour lecture et écriture ; le comportement est
le même que pour 'x'.
|
'c' |
Ouvre le fichier pour écriture seulement. Si le fichier n'existe pas, il
sera créé, s'il existe, il n'est pas tronqué (contrairement à
'w') et l'appel à la fonction n'échoue pas (comme dans
le cas de 'x'). Le pointeur du fichier est positionné
au début. Ce mode peut être utile pour obtenir un verrou (voir
flock()) avant de tenter de modifier le fichier, utiliser
'w' pourrait tronquer le fichier avant d'obtenir le verrou
(il est possible de toujours tronquer grâce à ftruncate()).
|
'c+' |
Ouvre le fichier pour lecture et écriture, le comportement est le même
que pour le mode 'c'.
|
'e' |
Définit l'indicateur close-on-exec sur le descripteur de fichier ouvert. Disponible uniquement en PHP compilé sur les systèmes conformes POSIX.1-2008. |
'n' |
Définit l'indicateur non-bloquant sur le descripteur de fichier. Seulement disponible en PHP compilé sur les systèmes conformes POSIX.1-2008. |
Note:
Les systèmes d'exploitation utilisent différents caractères pour les nouvelles lignes. Lors de l'écriture dans un fichier texte et que l'on insère une nouvelle ligne, il faut utiliser le bon caractère pour le système d'exploitation. Les systèmes Unix utilisent
\ncomme nouvelle ligne, les systèmes Windows utilisent\r\n, et les systèmes Macintosh (Mac OS Classic) utilisent\r.Si l'on n'utilise pas le bon caractère de nouvelle ligne lors de l'écriture des fichiers, il y a un risque d'ouvrir les fichiers avec des applications qui donneront un aspect 'bizarre' au texte.
Windows propose un mode de traduction (
't'), qui va traduire automatiquement les caractères\nen\r\nlors du travail sur le fichier. À l'inverse, il est possible d'utiliser l'option'b'pour forcer le fichier à être écrit en mode binaire, sans traduction des données. Pour utiliser ces options, ajoutez'b'ou't'comme dernier caractère du paramètremode.Le mode de traduction par défaut est
'b'. Il est possible d'utiliser't'lors de l'écriture dans des fichiers de texte et le caractère\npour définir les fins de ligne, dans les scripts, mais que l'on s'attend à ce que le fichier soit relu par une application comme les anciennes versions de Notepad. Il est recommandé de toujours utiliser l'option'b'dans les autres cas.Si l'on spécifie
't'lors du travail avec des fichiers binaires, il serait possible de rencontrer des problèmes avec les données, comme des images corrompues ou des caractères\r\ninopinés.
Note:
Pour des raisons de portabilité, il est fortement recommandé de réécrire les scripts qui utilisent l'option
't', pour qu'ils utilisent le bon caractère de nouvelle ligne et le mode'b'.
Note: Le
modeest ignoré pour les enveloppes de flux php://output, php://input, php://stdin, php://stdout, php://stderr et php://fd.
use_include_path
Le troisième paramètre optionnel use_include_path
peut être défini à true pour chercher le fichier dans
l'include_path.
contextNote: Une resource de contexte de flux.
Retourne une ressource représentant le pointeur de fichier,
ou false si une erreur survient
En cas d'échec, une alerte de type E_WARNING sera émise.
| Version | Description |
|---|---|
| 7.0.16, 7.1.2 |
L'option 'e' a été ajoutée.
|
Exemple #1 Exemple avec fopen()
<?php
$handle = fopen("/home/rasmus/file.txt", "r");
$handle = fopen("/home/rasmus/file.gif", "wb");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>
Lorsque SSL est utilisé, le serveur IIS de Microsoft violera le protocole en fermant la connexion sans
envoyer un indicateur close_notify. PHP le reportera en tant que "SSL: Fatal Protocol Error"
quand vous arrivez à la fin des données. Pour contourner ce le niveau de la directive
error_reporting doit être baissée pour ne pas inclure les avertissements.
PHP peut détecter automatiquement les serveur IIS bogué lors de l'ouverture
du flux en utilisant https:// et supprimera l'avertissement.
Lors de l'utilisation de fsockopen() pour créer un socket ssl://,
c'est au développeur de détecter et supprimer l'avertissement.
Note:
En cas de problèmes en lecture ou écriture de fichier et que l'on utilise PHP en version module de serveur, il est à noter que les fichiers auxquels l'on accède ne sont pas nécessairement accessibles au processus serveur.
Note:
Cette fonction peut également réussir lorsque
filenameest un dossier. En cas de doute sur le fait quefilenamesoit un fichier ou un dossier, il est possible d'utiliser la fonction is_dir() avant d'utiliser la fonction fopen().