fopen()
La fonction fopen() est une fonction PHP intégrée utilisée pour ouvrir un fichier et retourner un pointeur de fichier.
Qu'est-ce que la fonction fopen() ?
La fonction fopen() est une fonction PHP intégrée qui ouvre un fichier (ou une URL) et retourne un pointeur de fichier — un handle de ressource que vous passez ensuite à des fonctions comme fread(), fwrite(), fgets() et fclose() pour lire, écrire et fermer le flux. En cas d'échec, elle retourne false et émet un E_WARNING.
Presque toutes les opérations de fichier en PHP qui lisent ou écrivent de façon incrémentale commencent par fopen(). (Pour les lectures et écritures en une seule passe, vous utiliserez généralement file_get_contents() et file_put_contents() — voir Quand ne pas utiliser fopen().)
Syntaxe
fopen(string $filename, string $mode, bool $use_include_path = false, $context = null): resource|false| Paramètre | Description |
|---|---|
$filename | Chemin vers le fichier, ou une URL (ex. https://…, php://stdin) quand les wrappers sont activés. |
$mode | Comment ouvrir le fichier — lecture, écriture, ajout, etc. Voir le tableau ci-dessous. |
$use_include_path | Si true, PHP cherche aussi le fichier dans l'include_path. |
$context | Un contexte de flux optionnel créé avec stream_context_create(). |
Elle retourne une ressource pointeur de fichier en cas de succès, ou false en cas d'échec.
Les modes de fopen()
L'argument $mode est la partie que les gens se trompent le plus souvent. Il contrôle si le fichier est lu, écrit, ou les deux, où commence le pointeur interne, et si le fichier est tronqué ou doit déjà exister.
| Mode | Lecture | Écriture | Pointeur commence à | Tronque ? | Si le fichier est absent |
|---|---|---|---|---|---|
r | oui | non | début | non | avertissement, retourne false |
r+ | oui | oui | début | non | avertissement, retourne false |
w | non | oui | début | oui | le crée |
w+ | oui | oui | début | oui | le crée |
a | non | oui | fin | non | le crée |
a+ | oui | oui | fin (les écritures ajoutent toujours) | non | le crée |
x | non | oui | début | non | le crée ; échoue s'il existe |
x+ | oui | oui | début | non | le crée ; échoue s'il existe |
Vous pouvez ajouter b (binaire, ex. 'rb') ou t (texte) à n'importe quel mode. Utilisez toujours 'b' pour les fichiers non textuels tels que les images ou les exécutables — sur Windows, le mode texte traduit silencieusement les fins de ligne et corrompt les données binaires. Sur Unix, les deux sont identiques, donc 'b' est la valeur par défaut sûre partout.
Exemple de base : lire un fichier
Ouvrez un fichier en mode lecture, lisez son contenu, puis fermez-le. Vérifiez toujours la valeur de retour avant d'utiliser le handle, et utilisez toujours fclose() quand vous avez terminé afin que le système d'exploitation puisse libérer le descripteur.
<?php
$filename = 'myfile.txt';
$file = fopen($filename, 'r');
if ($file === false) {
echo "Unable to open file!";
} else {
echo fread($file, filesize($filename));
fclose($file);
}Nous ouvrons myfile.txt en mode lecture seule et vérifions le handle avec une comparaison stricte === false — cela est important car une ressource valide est truthy, mais certaines valeurs non erronées le sont aussi, donc des vérifications souples peuvent vous poser des problèmes plus tard.
Écrire dans un fichier
L'ouverture avec 'w' crée le fichier s'il n'existe pas et le tronque à zéro octet s'il existe. Utilisez 'a' à la place quand vous voulez ajouter à la fin sans effacer ce qui est déjà là (pratique pour les fichiers journaux).
<?php
$file = fopen('log.txt', 'w'); // create / overwrite
fwrite($file, "First line\n");
fwrite($file, "Second line\n");
fclose($file);
$file = fopen('log.txt', 'a'); // append, keep existing content
fwrite($file, "Appended later\n");
fclose($file);
echo file_get_contents('log.txt');Ceci affiche les trois lignes car 'a' a ajouté au fichier plutôt que de le remplacer. Voir fwrite() pour la partie écriture et feof() pour détecter la fin de fichier lors d'une boucle.
Lire ligne par ligne
Pour les fichiers volumineux, ne lisez pas tout en mémoire d'un coup. Combinez fopen() avec fgets() et feof() pour traiter une ligne à la fois en flux :
<?php
$file = fopen('myfile.txt', 'r');
if ($file) {
while (!feof($file)) {
$line = fgets($file);
if ($line !== false) {
echo $line;
}
}
fclose($file);
}Pièges courants
- Oublier de vérifier
false. Si le chemin est incorrect ou que les permissions refusent l'accès,fopen()retournefalseet avertit. Appelerfread()surfalselève uneTypeErroren PHP 8+. - Ne pas fermer le handle. Les descripteurs ouverts sont une ressource limitée ; les laisser fuir dans un processus de longue durée épuise finalement la limite du système d'exploitation. Utilisez toujours
fclose(), idéalement dans un blocfinally. - Mauvais mode. Utiliser
'w'alors que vous vouliez'r'efface silencieusement le fichier. Utilisez'x'quand vous voulez spécifiquement que la création échoue si le fichier existe déjà. - Chemins relatifs. Ils se résolvent par rapport au répertoire de travail courant du script, ce qui n'est pas toujours ce qu'on attend. Préférez les chemins absolus ou
__DIR__ . '/file.txt'.
Quand ne pas utiliser fopen()
Si vous avez juste besoin du fichier entier sous forme de string, ou d'écrire une string dans un fichier en un seul appel, évitez la procédure ouvrir/lire/fermer :
| Objectif | Fonction plus simple |
|---|---|
| Lire un fichier entier dans une string | file_get_contents() |
| Écrire une string dans un fichier en un seul appel | file_put_contents() |
| Lire un fichier dans un array de lignes | file() |
| Diffuser un fichier directement vers la sortie | readfile() |
Utilisez fopen() quand vous avez besoin d'un contrôle fin et incrémental — lire de grands fichiers par morceaux, ajouter à un journal, ou travailler avec des flux non-fichier comme php://stdin.
Conclusion
fopen() est le fondement de la gestion de fichiers de bas niveau en PHP : elle retourne un pointeur de fichier que vous lisez avec fread() / fgets(), dans lequel vous écrivez avec fwrite(), et que vous libérez toujours avec fclose(). Choisissez le bon mode, vérifiez la valeur de retour, et fermez le handle — le reste des fonctions de gestion de fichiers de PHP s'enchaîne naturellement.