LAMPE: Comment les créer .Zip de fichiers volumineux pour l'utilisateur à la volée, sans disque dur/PROCESSEUR raclée

Souvent un service web doit zip plusieurs fichiers de grande taille pour le téléchargement par le client. Le moyen le plus évident pour ce faire est de créer un temporaire de fichier zip, puis echo à l'utilisateur ou l'enregistrer sur le disque et de rediriger (supprimer un certain temps dans l'avenir).

Cependant, en faisant les choses de cette façon a des inconvénients:

  • une phase initiale intensive du PROCESSEUR et du disque raclée, résultant en...
  • un considérable retard initial de l'utilisateur pendant que l'archive est préparé
  • très forte empreinte mémoire par demande
  • utilisation importante de l'espace disque temporaire
  • si l'utilisateur annule le téléchargement de la moitié du chemin, toutes les ressources utilisées dans la phase initiale (CPU, mémoire, disque), aura été gaspillé

Solutions comme ZipStream-PHP améliorer sur ce à la pelle les données dans Apache fichier par fichier. Toutefois, le résultat est encore élevé, l'utilisation de la mémoire (les fichiers sont entièrement chargé en mémoire), et les grands, thrash des pics dans le disque et utilisation CPU.

En revanche, considérer les points suivants bash extrait de:

ls -1 | zip -@ - | cat > file.zip
  # Note -@ is not supported on MacOS

Ici, zip fonctionne en mode continu, résultant en une faible empreinte mémoire. Une pipe a une partie intégrante de la mémoire tampon lorsque la mémoire est pleine, le système d'exploitation suspend l'écriture du programme (programme sur la gauche de la pipe). Ici s'assure que zip ne fonctionne vite que son signal de sortie peut être écrit par cat.

La meilleure façon, alors, serait de faire la même chose: remplacer cat avec un serveur web de traiter, streaming le fichier zip à l'utilisateur qu'il a créé sur la volée. Cela permettrait de créer peu de surcharge par rapport à la juste streaming les fichiers, et aurait sans problème, non hérissés profil des ressources.

Comment pouvez-vous obtenir sur une pile LAMP?

  • Note: je suis en partie écrit cela à cause de la divers similar questions – apparaît comme un problème relativement fréquent, et n'a pas été très bien mis/encore répondu. ie Ont essayé d'écrire en streaming/PHP problème bien grave réponses seulement s'il vous plaît! (Suggestions pour améliorer le q beaucoup apprécié aussi.)
  • Vous pourriez probablement utiliser Node.js. Je sais que ça a été utilisé pour analyser les en-têtes de fichier téléchargé (alors qu'ils téléchargées). Depuis votre plus grand contrôle sur les tampons d'e/S de PHP, je suppose que ça ne devrait pas être difficile d'écrire un fichier zip en temps réel.
InformationsquelleAutor Benji XVI | 2010-12-05