Forum Linux.général Créer une archive zip de 2Go en modifiant les chemins dans l'archive

Posté par  . Licence CC By‑SA.
Étiquettes :
0
25
nov.
2013

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  . É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  . É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  . Évalué à 1.

        alors gagne une etape

        tu as deja ton arborescence initiale,
        il te reste donc à

        • copier vers une destination temporaire (selon les regles de renommage necessaire)
        • zipper le dossier temporaire
        • [^] # Re: unzip/move/zip

          Posté par  . É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  . É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.