Maison  >  Article  >  développement back-end  >  Comment diffuser des fichiers Zip volumineux en PHP sans surcharge de ressources ?

Comment diffuser des fichiers Zip volumineux en PHP sans surcharge de ressources ?

DDD
DDDoriginal
2024-11-07 21:02:02654parcourir

How to Stream Large Zip Files in PHP Without Resource Overwhelm?

Création d'un fichier .Zip de fichiers volumineux à la volée sans surcharge de ressources

Dans les services Web, la création d'un fichier zip de fichiers volumineux à télécharger peut nécessiter beaucoup de ressources. L'approche conventionnelle consiste à créer un fichier zip temporaire et à le renvoyer à l'utilisateur ou à l'enregistrer sur le disque. Cependant, cette méthode entraîne des problèmes tels que :

  • Pics de ressources initiales : Une augmentation de l'utilisation du processeur et du disque pendant la phase de création de fichiers.
  • Délai de téléchargement : Un retard notable pour les utilisateurs en attente de la fin de l'archive.
  • Excessif Empreinte mémoire : Consommation de mémoire importante lors de la gestion des fichiers.
  • Utilisation de l'espace disque : Création d'un espace disque temporaire pour le stockage des fichiers.
  • Gestion des ressources sur Annulation : Si un utilisateur annule en cours de téléchargement, toutes les ressources consommées dans la phase initiale sont gaspillé.

Surmonter la consommation de ressources

Une approche alternative consiste à exploiter les capacités de streaming de l'outil de ligne de commande Linux, zip. En utilisant une commande de pipeline comme ls -1 | zip -@ - | chat > file.zip, zip peut fonctionner en mode streaming, ce qui entraîne une empreinte mémoire minimale. Un tube dans ce contexte fonctionne comme un tampon ; lorsque le tampon est rempli, le système d'exploitation arrête temporairement le programme d'écriture. Cela garantit que zip fonctionne à un rythme qui correspond à la vitesse d'écriture du programme qui l'accompagne.

Streaming de fichiers Zip avec PHP

Pour obtenir le même mécanisme de streaming sur une pile LAMP à l'aide de PHP, vous peut utiliser les fonctions popen() ou proc_open() pour exécuter la commande zip. La sortie standard de la commande peut ensuite être récupérée sous forme de flux PHP. En combinant ces techniques, l'extrait de code suivant montre comment diffuser un fichier zip à l'utilisateur lors de sa création :

header('Content-Type: application/octet-stream');
header('Content-disposition: attachment; filename="file.zip"');

$fp = popen('zip -r - file1 file2 file3', 'r');
$bufsize = 8192;
$buff = '';

while(!feof($fp)) {
   $buff = fread($fp, $bufsize);
   echo $buff;
}
pclose($fp);

Ce code diffuse le fichier zip directement au client sans avoir besoin de stockage temporaire ou consommation excessive de mémoire. Il émule efficacement la fonctionnalité de la commande cat dans l'extrait bash.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn