Cours PHP Fichiers et Répertoires en PDF (Intermédiaire)
PHP : Fichiers et Répertoires : Ce qu'il faut savoir. Définition : ensemble des fonctions et méthodes PHP permettant d'ouvrir, lire, écrire, renommer et parcourir les fichiers et dossiers du système de fichiers, et d'utiliser la pseudo-classe dir pour naviguer dans un répertoire. Ces opérations sont au cœur des tâches serveur (logs, upload, stockage d'états, génération de ressources) et conditionnent la robustesse d'applications web côté back-end. Compatible avec PHP 7.x et PHP 8.1+ (notamment le passage progressif de certaines ressources vers des équivalents orientés objet), ce document, disponible au format PDF et facile à télécharger, propose des exemples de code et des travaux pratiques pour appliquer ces mécanismes.
🎯 Ce que vous allez apprendre
- Fonctions de gestion de fichiers — identification et manipulation via un identificateur/ressource :
fopen,fgets,fputs,fgetc,feof,readfile,unlink,fclose. Vous saurez comment ouvrir un flux, lire lignes ou octets, écrire des chaînes et fermer proprement la ressource pour éviter les fuites et l'incohérence des données. L'appel àfclose()libère la mémoire serveur associée au flux et permet de réduire le nombre de descripteurs ouverts, essentiel pour la stabilité applicative sous forte charge. On citera égalementfputcsvetfgetcsvpour l'export/import de données tabulaires au format CSV, utiles pour échanges ou exports léger sans base de données.Alternatives simplifiées :
file_get_contents()etfile_put_contents()offrent une API en une seule instruction pour lire ou écrire rapidement un fichier. Utiles pour des lectures/écritures atomiques simples ou des scripts d'administration, elles réduisent le code boilerplate lié à la gestion explicite des ressources. - Modes d'ouverture et comportement des streams — compréhension pratique des modes
'r','r+','w','w+','a','a+'et de leur impact sur le pointeur de fichier et la création/écrasement. Cette maîtrise permet de choisir le mode adapté (lecture seule, écriture append ou truncate) pour garantir l'intégrité des données et optimiser les accès disque. - Inspection et métadonnées de fichiers — fonctions utilitaires telles que
file_exists,filesize,filetype,copyetrename. Tester l'existence, obtenir la taille et le type d'un fichier et effectuer des opérations atomiques de copie/renommage est indispensable aux workflows de déploiement et sauvegarde. - Parcours de répertoires — API de gestion des dossiers :
chdir,getcwd,opendir,readdir,closedir,rewinddir. Itérer sur les entrées d'un dossier, filtrer ou lister les fichiers non triés et gérer le contexte du dossier courant sont des tâches fréquentes des scripts serveur. - Pseudo-classe dir — utilisation de l'objet
diravec ses attributshandleetpathet ses méthodesread()etclose(). L'approche objet simplifie la lecture séquentielle d'un répertoire et rend le code plus lisible par rapport à l'usage direct des fonctions procédurales. - Exemples et travaux pratiques — reproduction de scripts fournis : affichage de contenu fichier, listing de répertoire et exercices de compteur de visites (
visite1.php,visite21.php,visite22.phpaveccompteur1.inc.phpetcompteur2.inc.php). Implémentation d'un compteur persistant dans un fichier en tenant compte des verrous et des limites pratiques du stockage fichier.
📑 Sommaire du document
- Partie 1 : Introduction aux flux et ressources
- Partie 2 : Fonctions de gestion de fichiers (fopen, fgets, fclose...)
- Partie 3 : Modes d'ouverture et comportement des streams
- Partie 4 : Inspection et métadonnées de fichiers
- Partie 5 : Parcours et itération sur les répertoires
- Partie 6 : Pseudo-classe
diret approche objet - Partie 7 : Exemples pratiques et travaux dirigés
- Partie 8 : Sécurité, bonnes pratiques et cas d'usage
💡 Pourquoi choisir ce cours ?
Document concis issu du support BTS IRIS (Thierry VAIRA, intervenant pédagogique) : définitions techniques, extraits de code et exercices opérationnels. L'approche privilégie l'exemple pas-à-pas — chaque fonction est montrée en usage concret — ce qui facilite la transposition sur des projets existants ou hérités. Le PDF de 9 pages est adapté pour une montée en compétence ciblée sur la gestion des flux, des modes d'ouverture et du parcours de répertoires, sans surcharge théorique.
👤 À qui s'adresse ce cours ?
- Public cible : étudiants en BTS IRIS, développeurs web backend et administrateurs d'applications PHP qui doivent manipuler fichiers et répertoires côté serveur ou maintenir du code PHP procédural.
- Prérequis : connaissances de base en PHP (syntaxe, variables, boucles, include/require), et notions élémentaires d'administration de serveur (accès au système de fichiers et droits).
Alternatives modernes à fopen : file_get_contents et file_put_contents
Pour des lectures ou écritures rapides, file_get_contents et file_put_contents simplifient le code en évitant la gestion explicite des ressources. file_get_contents() peut lire un fichier local ou distant (si allow_url_fopen est activé) et convient pour charger le contenu complet en mémoire sous forme de chaîne. Attention aux limitations mémoire et aux implications liées aux permissions Linux lors de l'accès au système de fichiers serveur depuis des scripts PHP.
// Lecture d'un fichier local
$content = file_get_contents('/var/www/data/config.json');
// Lecture d'une ressource distante (si autorisé)
$remote = file_get_contents('https://example.com/data.txt');
if ($content === false) {
// gérer l'erreur : vérifier permissions, existence et configuration PHP
error_log('Échec de lecture : vérifier permissions Linux et chemin.');
}
Cas d'usage : Upload de fichiers
La gestion des répertoires est directement liée à la sécurité des téléchargements. Utiliser move_uploaded_file() pour déplacer les fichiers reçus vers un dossier contrôlé, vérifier le type MIME côté serveur et valider le nom du fichier empêche l'écriture hors du dossier attendu. Stocker les uploads en dehors de la racine web ou utiliser des règles d'accès renforce la sécurité.
- Vérifier que le répertoire cible est inscriptible (
is_writable) avant d'appelermove_uploaded_file. - Renommer de façon sûre les fichiers uploadés pour éviter les collisions et l'exécution de code.
Bonnes pratiques pour la manipulation de fichiers sur serveur
Contrôler les permissions, effectuer des écritures atomiques et gérer les verrous évite les corruptions et les conditions de course. La manipulation correcte des flux permet aussi de générer du contenu dynamique (pages pré-générées, caches statiques, exports) sans recourir systématiquement à une base SQL, utile pour des sites à faible volumétrie ou des scripts d'export.
- Écrire d'abord dans un fichier temporaire puis renommer atomiquement pour minimiser les risques de corruption.
- Utiliser
flockpour synchroniser les accès concurrents. - Contrôler les droits en lecture/écriture et journaliser les erreurs pour diagnostiquer les problèmes liés aux permissions Linux.
Maîtriser les permissions et la sécurité des fichiers
Les permissions du système de fichiers déterminent si un script PHP peut lire, écrire ou renommer un fichier. Sur Linux, les droits se gèrent via les bits utilisateur/groupe/autres et les attributs de propriétaire. En complément des vérifications applicatives (is_readable, is_writable), il est courant d'ajuster les droits côté serveur lors du déploiement pour éviter les erreurs d'accès. Pour les environnements partagés, limiter les droits au strict nécessaire réduit la surface d'attaque.
Gestion des droits (chmod)
PHP peut appeler chmod pour modifier les permissions d'un fichier si le processus web dispose des droits système requis. chown nécessite des privilèges plus élevés et n'est pas toujours disponible depuis un environnement mutualisé. Vérifier les permissions Linux avant les opérations critiques évite les erreurs runtime et facilite le diagnostic.
// Exemple : rendre un fichier accessible en lecture-écriture pour le propriétaire
$path = '/var/www/data/output.txt';
if (file_exists($path)) {
chmod($path, 0644); // octal : propriétaire rw, groupe r, autres r
}
Traitement de fichiers CSV et exports de données
Le format CSV reste une solution simple pour exporter ou importer des jeux de données. PHP propose des fonctions dédiées : fputcsv pour écrire une ligne CSV dans un flux et fgetcsv pour la lire. Ces fonctions gèrent les échappements et séparateurs, et conviennent pour des exports ponctuels ou des échanges entre outils. Pour de grands volumes, traiter ligne par ligne limite l'empreinte mémoire.
// Écriture d'un CSV ligne par ligne
$fp = fopen('/var/www/data/export.csv', 'w');
fputcsv($fp, ['id', 'nom', 'email']);
fputcsv($fp, [1, 'Dupont', 'dupont@example.com']);
fclose($fp);
Gestion des erreurs et Exceptions
Pour un niveau intermédiaire, combiner gestion d'erreurs et exceptions améliore la robustesse des scripts. Lors de l'ouverture d'un flux inexistant ou inaccessible, encapsuler l'opération dans un bloc try...catch et capturer Throwable permet de centraliser le traitement des erreurs et de journaliser le contexte.
try {
$fh = fopen('/var/www/data/missing.txt', 'r');
if ($fh === false) {
throw new RuntimeException('Impossible d\'ouvrir le fichier : vérifier le chemin et les permissions.');
}
// traitement...
} catch (Throwable $e) {
error_log('Erreur fichier : ' . $e->getMessage());
// actions de remédiation : alerter, retour utilisateur, etc.
} finally {
if (isset($fh) && is_resource($fh)) {
fclose($fh);
}
}
Sécuriser l'accès aux fichiers en PHP
- Valider les chemins d'accès pour prévenir les traversées de répertoires (directory traversal).
- Stocker les fichiers sensibles en dehors de la racine web et contrôler les règles d'accès via le serveur HTTP.
- Vérifier systématiquement
is_writableandis_readableavant les opérations.
Conclusion et perspectives
La maîtrise des fichiers et répertoires est une compétence fondamentale pour le développement back-end et la conception d'API. Une gestion rigoureuse des flux, des verrous et des permissions permet d'éviter corruptions, fuites de données et incidents de production. En évoluant vers PHP 8.1+ et ses apports, il devient plus simple d'aligner les API sur des patterns orientés objet tout en conservant des opérations fichiers performantes. Pour aller plus loin, intégrer ces principes dans les pipelines CI/CD et automatiser les vérifications de droits améliore la résilience des applications.
FAQ technique
Comment éviter les corruptions lors d'écritures concurrentes en PHP ?
Réponse : Synchroniser les accès : utiliser un mécanisme de verrouillage (par exemple flock) ou écrire dans des fichiers temporaires puis renommer atomiquement ; contrôler le pointeur et la séquence d'ouverture/fermeture évite les conditions de course. Vérifier les droits d'accès et la disponibilité du flux avant l'écriture avec is_writable est une précaution efficace.
Quelle est la différence entre la classe dir et opendir en PHP ?
Réponse : La pseudo-classe dir fournit un wrapper objet avec attributs (handle, path) et méthodes read() et close(), équivalentes aux fonctions procédurales readdir et closedir. L'approche objet améliore la lisibilité et l'encapsulation du parcours d'un répertoire.