Créer dynamicment de gros fichiers zip pour les téléchargements client

Il y a un projet où chaque utilisateur peut télécharger un fichier zip contenant environ 2 Go de données …

Le seul problème est qu’il y a quelques très petits fichiers qui doivent changer dans ce zip par utilisateur.

Existe-t-il une manière élégante de résoudre ce problème, à part de ne pas avoir besoin de tout cela dans le zip? Idées que j’ai considérées:

1) Envoi des commandes en attente dans une queue et traitement de cette queue lorsque des ressources sont disponibles … le traitement signifie créer un nouveau fichier zip pour chaque commande, puis le supprimer après N jours

2) Manipuler le fichier zip en PHP en quelque sorte, avant de l’envoyer via une sorte de push brut (par exemple, cracher l’en-tête, puis générer les données en fonction des fichiers + fichiers personnalisés)

Des idées de problèmes d’approche ou de mémoire que je pourrais rencontrer? Merci!

La structure du fichier ZIP est essentiellement:

  1. En-tête magique, identifiant le fichier comme une archive ZIP.
  2. Toutes les données du fichier, concaténées ensemble. (Les fichiers individuels peuvent éventuellement être compressés.)
  3. Répertoire d’archivage, contenant les métadonnées du fichier (noms, tailles, etc.) ainsi que le décalage par rapport aux données du fichier.

Cela signifie que vous devriez être capable de construire et de sortir l’archive ZIP à la volée, en ne conservant que les données du répertoire en mémoire jusqu’à ce que vous puissiez les écrire à la fin. L’archive ZIP ne devra jamais exister sur le disque.

Si vous utilisez cette approche, il n’y aura aucun problème de concurrence lors de l’offre du fichier ZIP à plusieurs clients à la fois, et vous ne devrez utiliser aucun espace disque lors de la création de l’archive.

A mon humble avis

vous pouvez envisager deux approche de fichier zip

  1. premier zip volonté contient tous les fichiers communs, et le rendre en tant que fichier statique pour le téléchargement (Cependant, le transfert Gb n’est pas fiable sur http, vous pouvez suggérer à l’utilisateur d’utiliser scp, ftp ou n’importe quel programme client permettant le téléchargement continu)
  2. second zip (script php) devrait contenir quelques très petits fichiers qui spécifient uniquement à l’utilisateur, dans ce cas, vous pouvez avoir un minimum de surcharge sur la mémoire / l’espace disque

Avez-vous regardé l’extension zip de PHP? http://php.net/zip

De ce que j’ai vu, vous pouvez manipuler les archives ZIP à la volée de manière OOP. Je ne suis pas sûr de la performance, il se peut que les zips de 2 Go prennent du temps à manipuler, mais vous devriez essayer vous-même.