Pour mémoire

  • PHP 7.2 à 7.4 fournissent la version 1.15
  • PHP 8.0 fournira la version 1.18
  • L'extension PECL permet de disposer des dernières versions sur toutes les versions de PHP, et elle est aussi disponible sur certaines distributions (Fedora, RHEL et CentOS 8) et bien sur pour les utilisateurs de mon dépôt.

Cette extension  utilise la bibliothèque libzip qui a reçu de nombreuses améliorations dans les versions récentes.

J'ai donc trouvé nécessaire d'actualiser l'extension pour tirer bénéfices de ces nouveautés.

Version 1.16

Enregistrement de la date de modification d'un fichier à l'aide des fonctions ZipArchive::setMtimeIndex et ZipArchive::setMtimeName. Surtout utile lorsqu'on ajoute du contenu directement (pas à partir d'un fichier).

Gestion de la compression XZ. Nécessite la bibliothèque en version ≥ 1.6 avec l'option activée.

Version 1.17

Gestion d'une fonction de rappel pour gérer la progression de l'enregistrement de l'archive: ZipArchive::registerProgressCallback. Nécessite la bibliothèque en version ≥ 1.3.

Gestion d'une fonction de rappel pour gérer l'annulation de l'enregistrement de l'archive; ZipArchive::registerCancelCallback. Nécessite la bibliothèque en version ≥ 1.6.

Ouverture possible en mode lecture seule. Nécessite la bibliothèque en version ≥ 1.0.

Version 1.18

Ajout d'un paramètre flags aux méthodes ZipArchive::addEmptyDir, ZipArchive::addFile et ZipArchive::addFromString. Cette option permet de gérer plus finement l'encodage des caractères des noms, et le replacement.

Ajout de l'entrée flags au tableau d'options passé aux méthodes ZipArchive::addGlob et ZipArchive::addPattern.

Ajout de la méthode ZipArchive::replaceFile pour modifier le contenu d'une entrée sans changer son nom.

Ajout de la propriété lastId qui indique l'index de la dernière entrée ajoutée, évitant de devoir faire une recherche pour effectuer d'autres opérations (commentaire, attributs, ...).

Les propriétés status, statusSys et la méthode ZipArchive::getStatusString sont désormais disponible après la fermeture d'une archive, permettant de connaitre la raison d'une eventuelle erreur.

Conclusion

Je pense que ces nombreuses modifications apportent une amélioration significative des fonctionnalités de cette extension.

Un exemple assez complet est disponible dans le dépôt des sources: zipcmd.php.

Le documentation est déjà totalement actualisée.

Avenir

Je vais continuer à suivre de près les évolutions de la bibliothèque libzip afin de tirer rapidement les bénéfices de ses évolutions.

J'attends des retours sur une proposition d'évolution qui permettrait de connaitre les fonctions optionnelles disponibles (cryptage, compression).

Je réfléchi aussi à la sauvegarde et la restauration des droits des fichiers, malheureusement l'API actuelle ne me semble pas adaptée, en particulier pour les répertoires. Je crains aussi que la restauration des droits puissent être exploitée pour des attaques de sécurité, à partir d'archives spécialement créées. Cette gestion reste facilement accessible à l'aide des méthodes ZipArchive::setExternalAttributesName et ZipArchive::getExternalAttributesIndex (voir leur exemples).