En commençant la revue de code des deux classes Zip et Unzip de Clearbricks je me suis demandé s’il n’y avait pas une alternative à ce code embarqué dans notre bibliothèque pour gérer les archives, vu qu’on s’en sert pour la mise à jour de Dotclear et pour l’installation et la mise à jour des modules tiers (plugins et thèmes).
En cherchant un peu j’ai vu qu’il y avait un support du format Zip utilisable nativement avec PHP mais seulement si l’option a été activée au moment de la compilation (paramètre --with-zip
). Un peu aléatoire de s’appuyer la dessus sachant que la mise à jour dépend de la possibilité de décompresser l’archive téléchargée !
Et puis j’ai continué à explorer et j’ai découvert Phar, et sachant que depuis PHP 5.3 L’extension Phar est intégrée dans PHP, et activé par défaut.
et qu’elle est capable nativement de créer et de décompresser des archives Zip et Tar.
Je me suis demandé aussitôt pourquoi on ne l’avait pas utilisée depuis toutes ces années !
Ni une ni deux, après avoir viré phar
de la liste des stream wrappers qu’on désactivait dans Dotclear j’ai fait un test :
try {
// Archive creation
// Remove archive if exists
if (file_exists('/Users/bibi/Downloads/debug.zip')) {
unlink('/Users/bibi/Downloads/debug.zip');
}
// Create a new Zip archive
$a = new \PharData('/Users/bibi/Downloads/debug.zip', \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS, null, \Phar::ZIP);
// Add a file in it
$a->addFile('/Users/bibi/Downloads/dotclear-notes.md', '/notes/dotclear-notes.md');
// Archive extraction
// Open the existing Zip archive created above
$b = new \PharData('/Users/bibi/Downloads/debug.zip', \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS, null, \Phar::ZIP);
// Extract all in a temporary folder
$b->extractTo('/tmp');
} catch (\Exception $e) {
echo '<p> Error: ' . $e->getMessage() . ' (' . $e->getCode() . ')</p>';
}
Quelques lignes pour créer une archive avec un fichier dedans et pour la décompresser ensuite dans un répertoire temporaire.
L’archive se nomme debug.zip et contient un répertoire notes contenant lui-même un fichier dotclear-notes.md.
Une fois décompressée je retrouve un dossier notes contenant le fichier dotclear-notes.md dans le répertoire /tmp.
Je vois pas beaucoup plus simple que ça et ça marche au poil !
Questions :
Est-ce qu’on remplace nos classes, ou plutôt est-ce qu’on adapte nos classes pour virer toute la logique d’écriture et de lecture des archives Zip et la remplacer par l’usage de
PharData
? Sachant que c’est une fonctionnalité sensible ?Est-ce que ça ne ferait pas un bon exercice pour quelqu’un qui souhaiterait se mettre au développement, en n’oubliant pas au passage les tests unitaires qui vont bien pour s’assurer que ça fonctionne comme prévu ?
Au passage un exemple de remplacement de l’usage de ZipArchive par Phar dans un projet (composer).
1 De Jean-Christian Paul Denis -
Je découvre en te lisant que phar sait gérer les zip 😮 Pourquoi ne le savais-je pas ? Il y a anguille sous roche.
Pour avis perso, après moulte test j’utiliserais phar partout dans dotclear. Mais garderais évidement zip dans clearbricks encore un petit moment. Ben ouai j’ai pleins de plugins pas à jour qui utilisent zip.
2 De Franck -
En fait je pense qu’il faudrait simplement ré-écrire les classes Zip et Unzip pour qu’elles offrent les mêmes méthodes publiques avec les mêmes signatures qu’avant, mais qu’elles utilisent
PharData
pour gérer les archives.Comme ça on utilise de quoi (dé)compresser et fourni nativement par PHP tout en restant compatible avec tout le monde.
PS : J’ai pas du tout évalué le taf’ induit par ça, mais je pense que ça peut être assez fun à coder, si quelqu’un a envie de se frotter à PHP.
3 De Bernard -
Je me demande (peut-être à tort) si, en préalable, il ne faut pas vérifier que cette extension
phar
n’est pas été désactivée par l’hebergeur du site (ou un quelconque script)…4 De Franck -
Oui Bernard il y a surement des précautions à prendre de ce genre.
D’ailleurs Dotclear le désactive sur les pages d’administration, jusqu’à maintenant, puisqu’on en avait pas besoin, toujours une source de problèmes en moins.
5 De Tomek -
La plupart des hébergeurs l’active, de ceux que je connais et utilise, seul Ionos (ex 1&1) ne le fait pas. Idem avec la compression gzip.