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 :
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.
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!