Programmation PHP/Fichiers
L'utilisation de fichier peut être utile pour exporter des données à archiver ou accélérer un traitement par un système de cache. Cette page explique comment interagir avec un fichier.
Dossiers.
Voici les fonctions usuelles de navigation et manipulation du système de fichier.
Lecture.
Récupérer certains fichiers d'un dossier.
Par exemple, pour trouver tous les fichiers .sql du dossier "sql" :
 chdir('sql');
 $files = glob('*.sql');
 var_dump($files);
Droits des fichiers.
Windows.
Sous Windows il suffit de se rendre dans l'onglet sécurité des propriétés d'un fichier, pour cocher les cases autorisant le programme à le lire et/ou le modifier.
Unix.
"chmod" est le système de droit d'accès a un fichier . Il s'agit d'un nombre à trois chiffres que l’on attribut à un fichier (ex. : 755). Il détermine le droit d'accès au fichier en question, qui peut le modifier.
Selon sa valeur le autorise ou non la modification du fichier. Sous GNU/Linux, l'utilisateur 'root', (superutilisateur), a tous les droits, c'est-à-dire qu’il peut modifier tous les fichiers.
Lorsque qu'un fichier est créé manuellement, le "chmod" du fichier en question est 755, avec un tel "chmod" nous ne pouvons pas modifier le fichier avec un script PHP. Pour pouvoir le modifier, il suffit juste de changer le "chmod" du fichier, en lui donnant la valeur "766". Sous Windows, cette notion est masquée et il suffit d’être administrateur de la machine (utilisateur par défaut) pour pouvoir modifier un fichier.
Ouvrir un fichier.
Pour déclencher l'ouverture d'un fichier chez celui qui exécute le script, on précise son type puis son emplacement :
header("Content-Type: application/pdf");
header("Content-Disposition: inline; filename='".$fichier."'");
Télécharger un fichier.
header("Content-Type: application/pdf");
header("Content-Disposition: attachment; filename='".$fichier."'");
Zipper un fichier.
Installation.
Cette fonctionnalité est fournie nativement depuis PHP 5.2.0. Par contre sur les versions >= 7 sur Linux il faut l'installer :
 RUN apt-get update && \
 apt-get install -y \
 libzip-dev \
 && docker-php-ext-install zip
Utilisation.
Pour compresser des fichiers, il faut d'abord créer l'archive vide, puis les y ajouter un par un avec la méthode codice_19 :
$zip = new ZipArchive();
$f = '../Temp/'.$nomFichier . '.zip';
if ($zip->open($f, ZipArchive::CREATE) !== true) {
 exit('Impossible de créer le .zip');
$zip->addFile('../Temp/' . $nomFichier . '.xls', $nomFichier . '.xls');
$zip->close();
Dézipper un fichier.
$zip = new ZipArchive();
$f = '../Temp/'.$nomFichier . '.zip';
if ($zip->open($f) === true) {
 $zip->extractTo('../Temp/');
 $zip->close();
Pour les .gz :
 private function uncompressFile(string $target): void
 $uncompressedFileName = str_replace('.gz', ", $target);
 $file = gzopen($target, 'rb');
 $outFile = fopen($uncompressedFileName, 'wb');
 while (!gzeof($file)) {
 fwrite($outFile, gzread($file, 4096));
 fclose($outFile);
 gzclose($file);
Éditer et fermer un fichier.
Créer un fichier avec un attribut "chmod" de "766". Ensuite il faut ouvrir le fichier en question avant de lire/écrire. Pour cela la fonction "fopen" est là :
Explication : La fonction "fopen" à besoin de deux paramètres pour pouvoir s'exécuter :
La fonction "fopen" utilise le premier paramètre, pour déterminer le chemin du fichier a ouvrir/créer.
Voici les différents modes d'ouvertures pour la fonction "fopen" :
Pour le fermer maintenant, il y a la fonction "fclose".
Copier un fichier.
if (!copy($ancienFichier, $nouveauFichier)) {
 echo 'La copie a échoué.';
Pour les images il existe aussi codice_20.
Supprimer un fichier.
if (!unlink($fichier)) {
 echo 'La suppression a échoué.';
Interagir avec le fichier.
Lecture.
Une fois ouvert, il existe plusieurs manière de lire le contenu d'un fichier : caractère par caractère, ligne par ligne, jusqu'à une certaine taille, ou tout entier. 
Tout le fichier.
file.
Pour stocker le fichier entier dans un tableau, on peut utiliser "file()" qui renvoie un tableau séparant chaque ligne du fichier :
Ainsi, "$fichier[0]" correspond à la première ligne, "$fichier[1]" à la seconde, etc.
Si le fichier sature la mémoire, utiliser file_lines() avec les générateurs.
file_get_contents.
Pour stocker le fichier entier dans un scalaire, on utilise cette fonction.
readfile.
Pour afficher tout le fichier dans la sortie standard.
Ligne par ligne.
fgets.
La méthode générale pour lire ligne par ligne avec la fonction "fgets", dont la définition est la suivante :
La variable "$objetFichier" doit être le résultat de l'ouverture d'un fichier avec "fopen". Pour lire un fichier en entier, il suffit d’utiliser "fgets" en boucle ; la condition de sortie de la boucle serait alors l'arrivée à la fin de fichier, évènement notifié par la fonction "feof".
fgetc.
La fonction équivalente pour lire caractère par caractère se nomme "fgetc" :
Notez que cette fonction retourne FALSE arrivée à la fin du fichier. Lors d'un parcours, il faut donc tester impérativement la valeur avant de l’utiliser, avec un test logique de la forme « $caractere !== FALSE ».
fgetcsv.
Cette fonction fonctionne comme "fgets" sauf qu'en plus elle utilise le séparateur "," (qui peut être changé par le paramètre "delimiter") pour créer un sous-tableau de champs par ligne.
Écriture.
Une fois le fichier ouvert, l'écriture se fait via la fonction "fwrite".
Explication : 
L'utilisation est alors la même que pour la lecture : ouvrir le fichier, écrire et fermer.
Attention : Si vous ouvrez le fichier avec l'option "w" ou "w+", le contenu du fichier sera effacé s'il existait. Pour écrire à la fin, il faut ouvrir avec les options "a" ou "a+" (voir ci-dessus). Enfin, si vous pouvez avec l'option "r+", le contenu sera écrasé, puisque le pointeur de fichier sera placé au début.
Par ailleurs, la fonction "file_put_contents()" effectue un "fopen()", "fwrite()" et "fclose()" successivement.
Se déplacer.
Parfois, il peut être nécessaire de se déplacer dans le fichier, par exemple pour revenir au début. Pour cela, il faut utiliser la fonction "fseek" comme suit :
Explication :
Pour aller à la fin :
Fichiers uploadés.
Copier-coller ces lignes dans un fichier vierge "upload.php" pour qu’il affiche le nom des fichiers qu'on upload avec :
<?php
echo '
<form method="POST" action="upload.php" enctype="multipart/form-data">
 <input type="file" name="fichier">
 <input type="submit" name="envoyer" value="Uploader">
</form>';
if (isset($_FILES['fichier'])) {
 echo $_FILES['fichier']['name'];
Il existe la fonction is_uploaded_file() pour vérifier si un fichier est bien issu d'un upload, et move_uploaded_file() pour le déplacer.
Fichiers temporaires.
Pour créer des fichiers qui seront automatiquement détruits en fin de connexion, le dossier temporaire est accessible avec : codice_21.
La fonction codice_22 quant-à elle nomme automatiquement un nouveau fichier temporaire avec un nom unique :
$fileName = tempnam(sys_get_temp_dir(), 'MonFichier1');
Fichiers distants.
HTTP.
Pour lire un fichier en HTTP (par exemple cette page web) :
<?php
$page = file_get_contents("http://fr.wikibooks.org/wiki/PHP/Fichiers");
echo $page;
ou
<?php
$url = 'http://fr.wikibooks.org/wiki/PHP/Fichiers';
echo htmlspecialchars(implode(", file($url)));
Pour tester si un fichier distant existe, utiliser codice_23.
FTP.
Installation : dans php.ini, décommenter "extension=ftp" (anciennement "extension=php_ftp.dll").
Déposer un fichier (sans vérifier s'il en écrase un) :
<?php
copy('fichier_local.txt', 'ftp://login:password@server/repertoire/fichier_distant.txt');
Souvent le répertoire porte le nom de l'utilisateur, et on écrase le fichier s'il existe :
<?php
$serveur = 'serveur1';
$login = 'utilisateur1';
$password = 'mdp1';
$fichier = 'fichier1';
copy($fichier, 'ftp://'.$login.':'.$password.'@'.$serveur.'/'.$login.'/'.$fichier, stream_context_create(array('ftp' => array('overwrite'=>True))));
Fonctions propres au FTP, pour lire un serveur distant, y télécharger et déposer des fichiers :
$cnx = ftp_connect($serveur);
$loginResult = ftp_login($cnx, $login, $password);
// Liste des noms des dossiers et fichiers du dossier distant (dans le désordre)
$dossierDistant = ftp_nlist($cnx, ".");
var_dump($dossierDistant);
// Liste des éléments du dossier distant avec leurs inodes
$dossierDistant2 = ftp_rawlist($cnx, ".");
var_dump($dossierDistant2);
// Change de répertoire :
var_dump(ftp_pwd($cnx));
ftp_chdir($cnx, 'tmp');
var_dump(ftp_pwd($cnx));
// Téléchargement du dernier fichier distant
sort($dossierDistant);
$distant = $dossierDistant[sizeof($dossierDistant)-1];
$local = 'FichierLocal.txt';
if (!ftp_get($cnx, $local, $distant, FTP_BINARY)) {
 echo "Erreur ftp_get\n";
} else {
 ftp_delete($cnx, $distant);
// Téléversement d'un fichier local
$local = 'FichierLocal2.txt';
if (!ftp_put($cnx, $distant, $local, FTP_ASCII)) {
 echo "Erreur ftp_put\n";
Pour définir le timeout, voir codice_24.
SFTP.
On utiliser les trois fonctions suivantes pour construire l'URL ouverte par codice_25 :
$connexion = ssh2_connect('tools-login.wmflabs.org', 22);
ssh2_auth_password($connexion, 'monLogin', 'MonMotDePasse');
$sftp = ssh2_sftp($connexion);
$stream = fopen("ssh2.sftp://$sftp/monFichier", 'r');
php://.
Ce protocole donne accès aux flux (entrant et sortant) de PHP.
Fichiers binaires.
Certains fichiers binaires comme les .docx et les .xlsx seront abordés dans les chapitres suivants sur les bibliothèques et frameworks.