Bonjour, voilà le message que j'ai publié sur développez dernièrement :
Bonjour,
J'ai un problème avec la classe ZipArchive et je ne suis visiblement pas le seul à avoir…
Je dois créer une archive à partir de plusieurs (272 dans le cas qui a fait planter mon appli) fichiers images dont je construis le chemin du fichier d'origine et celui dans l'archive à partir des infos contenues dans une base de données (donc un exec zip n'est pas possible en l'état).
Comme j'en ai pour plus de 2Go, ZipArchive me laisse une archive temporaire d'environ 500Mo et le script plante sans envoyer d'erreur.J'ai même essayer de faire un $zip->close(), $zip->open($zippath) tous les 10 fichiers, mais comme il charge tout le fichier à l'ouverture je me retrouve avec le même problème.
Existe-t-il une alternative à ZipArchive me permettant d'ajouter mes fichiers les uns après les autres dans mon zip sans charger l'ensemble en mémoire ?
Ne trouvant pas de solution en PHP, je vais tenter en lignes de commande avec exec.
la commande zip ne le permet pas directement, il faudrait que j'utilise zipnote à chaque fois pour renommer le fichier dans l'archive ; ce qui ne serait pas forcément un problème s'il zipnote pouvait gérer des archive de plus de 2 Go… Ce qui n'est pas le cas d'après la doc.
Connaissez-vous une solution alternative ?
# unzip/move/zip
Posté par NeoX . Évalué à 2.
et faire simplement en 3 etapes ?
1°) decompresser l'archive
2°) deplacer les fichiers dans leurs nouvelles arborescences (selon la base de données)
3°) recompresser l'archive
[^] # Re: unzip/move/zip
Posté par Raphaël MICHEL . Évalué à 0.
Ce serait la solution de dernier recours, en effet.
Disons que la perte en espace disque et en temps est énorme dans ce cas.
Parce qu'on doit effectuer une copie de 2Go de fichiers en plus, et on a dans ce cas les fichiers d'origine, le dossier temporaire et le zip final.
Pour info, à la base je n'ai pas un zip, mais une arborescence du type :
/uploads/pictures/00000040/
/uploads/pictures/00000040/0000000118/
/uploads/pictures/00000040/0000000118/thumbnails/
/uploads/pictures/00000040/0000000121/
/uploads/pictures/00000040/0000000121/thumbnails/
/uploads/pictures/00000058/
/uploads/pictures/00000058/0000000215/
/uploads/pictures/00000058/0000000215/thumbnails/
[^] # Re: unzip/move/zip
Posté par NeoX . Évalué à 1.
alors gagne une etape
tu as deja ton arborescence initiale,
il te reste donc à
[^] # Re: unzip/move/zip
Posté par Tonton Benoit . Évalué à 5.
Sauf si tu lui demande le contraire, zip ne gère pas les liens symboliques par défaut, donc au lieu de copier vers une destination temporaire, il suffit de faire un symlink vers celle-ci. Plus rapide, moins gourmand.
[^] # Re: unzip/move/zip
Posté par Raphaël MICHEL . Évalué à 2.
Géniale ta solution !
Cela m'a même permis de régler un autre problème par la même occasion ;)
Donc en PHP je crée mon arborescence avec mkdir() et mes liens avec symlink() puis je fais un exec('zip untruc.zip . > /dev/null &') et tout marche d'enfer.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.