Zip

Zip utility library

Pour deux projets à venir, j'ai besoin de lire et d'écrire des fichiers zip, possiblement avec de gros volumes en sortie.

PHP fournit de base deux extensions dans ce thème : zip et zlib.

zip tourne autour d'une classe ZipArchive qui sait lire et écrire des fichiers zip. Les problèmes, c'est que cette lib ne sait pas streamer en write et qu'il n'y a pas de dissociation propre entre read et write.

zlib est plus "bas niveau" en permettant de manipuler différents flux compressés.

Read / Write

De mon point de vue, il est bon de dissocier les besoins à travers des interfaces pour éviter de faire des bêtises. J'ai donc séparé ces notions : ZipWriter et ZipReader. Ces deux classes utilisent une interface dédiée. Cela m'a permis de créer des adapters dédiés pour ZipArchive en read et en write.

Stream write

Je veux pouvoir permettre à un utiliseur de downloader des centaines de fichiers en 1 seule fois sans passer par la case disque ou ram. Pour cela, une seule solution : écrire le zip à la volée.

Je me suis plongé dans les docs de Pkware qui décrivent précisément comment est structuré un zip. Et j'ai réimplementé un writer zip. Evidemment, je n'ai pas implémenté toute la spécification (entre autres le chiffrement) en restant simple sur l'algorithme de compression deflate utilisé.

Grâce au découplage read & write, il a suffi de coder un adaptateur dédié pour ZipWriter.

Retour d'expérience

Moi qui utilise le format zip depuis plusieurs décennies, ce fut très intéressant de plonger dans sa structure.

Détails

Pour plus de détails techniques, allez voir le README sur Gitlab.

Liens