Maison >développement back-end >tutoriel php >Comment diffuser dynamiquement des fichiers Zip sur une pile LAMP sans créer de fichiers temporaires ?
Comment diffuser dynamiquement des fichiers Zip sur une pile LAMP
Le défi
Créer des archives La suppression de fichiers volumineux à la volée dans un service Web peut entraîner des problèmes de performances et des contraintes de ressources. Les méthodes traditionnelles impliquent la création de fichiers zip temporaires, ce qui entraîne une surcharge du processeur, du disque et de la mémoire.
Solution de streaming avec popen() et flush()
Pour éviter ces inconvénients , envisagez de diffuser la création du fichier zip directement à l'utilisateur. Ceci peut être réalisé en utilisant popen() ou proc_open() pour exécuter une commande de pipeline de streaming (par exemple, zip). La combinaison de cela avec flush() permet une diffusion efficace du fichier zip au fur et à mesure de sa création.
Exemple révisé
Voici un exemple de code mis à jour qui répond à certaines mises en garde soulevées par @Benji dans les commentaires :
<?php // Set headers header('Content-Type: application/octet-stream'); header('Content-disposition: attachment; filename="file.zip"'); mb_http_output('pass'); // Execute pipeline command using popen() $fp = popen('zip -r - file1 file2 file3', 'r'); // Initialize buffer $bufsize = 8192; // Stream zip file while (!feof($fp)) { $buff = fread($fp, $bufsize); echo $buff; } // Close process pclose($fp);
Remarque : Bien que flush() ait été initialement recommandé, il est conseillé d'éviter de l'utiliser dans la boucle pour les fichiers volumineux ou les réseaux lents. Cela peut entraîner des problèmes de dépassement de tampon.
Considérations supplémentaires
Pour les serveurs multiprocesseurs, envisagez d'utiliser nodeJS avec les modules http et child_process pour une utilisation efficace et non bloquante. /O.
La définition de l'en-tête Content-Length n'est pas possible dans ce scénario car la taille du fichier zip est inconnue au préalable. Cependant, envisagez de vérifier s'il existe des en-têtes indiquant une diffusion en continu ou une longueur de contenu inconnue.
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!