Zip zip

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 :

  1. 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 ?

  2. 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).

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/15462

Haut de page