Article archivé de 2013. Conservé à titre d’archive ; la technologie est obsolète.

Génération automatique du cache.manifest en PHP

5 min de lecture

Si vous ne voulez pas lire l’article en entier, vous pouvez récupérer le code (et proposer des modifications, bien sûr) sur GitHub : https://github.com/tx2z/autogenerated-cache.manifest-php

Une chose très intéressante dans HTML5 est la possibilité de créer des applications ou des pages web hors ligne grâce au fichier cache.manifest. Ces pages peuvent être lues par l’utilisateur quand il n’a pas de connexion à Internet, ce qui, aujourd’hui, avec la mauvaise couverture du réseau mobile à certains endroits, arrive couramment. C’est aussi une bonne idée avec une bonne connexion, car l’utilisateur n’a pas à télécharger toutes les données et la page se charge plus vite.

Donc oui, c’est vraiment intéressant, mais si vous avez déjà essayé de créer un cache.manifest vous-même, cela demande du temps et des efforts, car il faut le mettre à jour à chaque fois que vous ajoutez ou modifiez un fichier dans votre site ou votre application.

Pour cette raison, j’ai cherché un moyen simple, ou mieux, automatique, de générer ce fichier, et j’ai découvert que c’est vraiment facile avec PHP (je suis sûr que c’est aussi le cas avec d’autres langages côté serveur).

Regardez le code pour voir à quel point c’est simple :

 1<?php
 2// Add the correct Content-Type for the cache manifest
 3header('Content-Type: text/cache-manifest');
 4
 5// Write the first line
 6echo "CACHE MANIFEST\n";
 7
 8// Initialize the $hashes string
 9$hashes = "";
10
11function create_manifest($folder) {
12  $dir = new RecursiveDirectoryIterator($folder);
13	// Iterate through all the files/folders in the current directory
14	foreach (new RecursiveIteratorIterator($dir) as $file) {
15		$info = pathinfo($file);
16
17		// If the object is a file
18		// and it's not called manifest.php (this file),
19		// and it's not a dotfile, add it to the list
20		if ($file -&gt; IsFile() && $file != "./manifest.php" && substr($file -&gt; getFilename(), 0, 1) != ".") {
21			// Replace spaces with %20 or it will break
22			echo str_replace(' ', '%20', $file) . "\n";
23
24			// Add this file's hash to the $hashes string
25			$hashes .= md5_file($file);
26		}
27	}
28}
29
30create_manifest(".");
31
32// Write the $hashes string 
33echo "# Hash: " . md5($hashes) . "\n";
34?>

Je pense que cela n’a pas besoin de beaucoup d’explications, mais :

– D’abord, nous déclarons que le fichier est un cache.manifest et nous écrivons « CACHE MANIFEST » sur la première ligne :

1<?php
2// Add the correct Content-Type for the cache manifest
3header('Content-Type: text/cache-manifest'); 
4
5// Write the first line
6echo "CACHE MANIFEST\n";
7?>

– Presque tout se passe dans la fonction « create_manifest », qui parcourt tous les fichiers et dossiers du dossier défini dans la variable $folder.

À l’intérieur de la fonction, nous créons un tableau, $dir, qui contient tous les fichiers et dossiers, grâce à la classe « RecursiveDirectoryIterator ». Nous parcourons ce tableau avec « foreach » et nous récupérons le chemin de chaque fichier avec « pathinfo ».

Ensuite, si l’objet est un fichier (et non un dossier), qu’il ne s’appelle pas manifest.php (car si vous mettez votre fichier manifest en cache, vous allez passer un mauvais moment) et que ce n’est pas un « dotfile », nous l’écrivons dans la page en remplaçant les espaces par %20 (en théorie, ce n’est pas nécessaire, si vous avez créé vos URL et vos fichiers correctement 🙂).

Enfin, nous ajoutons le hash MD5 du fichier à la variable $hashes (je l’expliquerai plus loin).

 1<?php
 2function create_manifest($folder) {
 3  $dir = new RecursiveDirectoryIterator($folder);
 4  // Iterate through all the files/folders in the current directory
 5	foreach (new RecursiveIteratorIterator($dir) as $file) {
 6		$info = pathinfo($file);
 7
 8		// If the object is a file
 9		// and it's not called manifest.php (this file),
10		// and it's not a dotfile, add it to the list
11		if ($file -&gt; IsFile() && $file != "./manifest.php" && substr($file -&gt; getFilename(), 0, 1) != ".") {
12			// Replace spaces with %20 or it will break
13			echo str_replace(' ', '%20', $file) . "\n";
14
15			// Add this file's hash to the $hashes string
16			$hashes .= md5_file($file);
17		}
18	}
19}
20?>

– Il reste à appeler la fonction sur le dossier dont nous voulons ajouter les fichiers au cache.manifest. Nous pouvons mettre un point (.) pour tout inclure.

1<?php
2create_manifest(".");
3?>

– Enfin, si nous modifions le contenu d’un fichier sans changer son nom (nous mettons à jour une image, par exemple), le navigateur ne sait pas que le fichier a changé et va utiliser la version en cache. Mais si le cache.manifest a changé, il va télécharger de nouveau tous les fichiers.

En écrivant la variable $hashes (qui est différente à chaque modification d’un fichier), nous nous assurons que le navigateur va télécharger tous les fichiers si nous changeons quoi que ce soit.

1<?php
2// Write the $hashes string
3echo "# Hash: " . md5($hashes) . "\n";
4?>

Et c’est tout. Il ne reste qu’à l’ajouter dans notre page web après la déclaration du doctype :

1<!DOCTYPE html>
2<html manifest="manifest.php">

Nous avons un fichier cache.manifest généré automatiquement, que nous n’avons plus besoin de mettre à jour à chaque fois 🙂

Cela fonctionne, par exemple, dans la version tablette de la Revista Exégesis : http://www.revista-exegesis.com/publicaciones/2059/