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.