Maison  >  Article  >  développement back-end  >  Comment diffuser des fichiers Zip volumineux sur la pile LAMP pour des téléchargements plus rapides ?

Comment diffuser des fichiers Zip volumineux sur la pile LAMP pour des téléchargements plus rapides ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-08 02:42:02564parcourir

How to Stream Large Zip Files on LAMP Stack for Faster Downloads?

Création de fichiers Zip à la volée pour les fichiers volumineux sur une pile LAMP

Problème :

Lors de la création de fichiers zip de plusieurs fichiers volumineux à télécharger par l'utilisateur, les méthodes conventionnelles entraînent des problèmes de performances importants au cours de la phase initiale en raison d'une utilisation intensive du processeur et du disque.

Solution utilisant le streaming :

Pour résoudre ce problème, nous pouvons exploiter les capacités de streaming de zip en utilisant popen() ou proc_open() pour exécuter le pipeline de commandes zip et récupérer la sortie standard sous forme de flux PHP. En combinant cela avec un processus de serveur Web, nous pouvons diffuser le fichier zip à l'utilisateur lors de sa création à la volée.

Implémentation à l'aide de popen() :

<?php
// Set necessary headers
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename="file.zip"');

// Execute zip command and retrieve stdout as a stream
$fp = popen('zip -r - file1 file2 file3', 'r');

// Read and echo data in chunks
$bufsize = 65535;
$buff = '';
while (!feof($fp)) {
    $buff = fread($fp, $bufsize);
    echo $buff;
}
pclose($fp);
?>

Conseils d'optimisation :

  • Utilisez une taille de tampon appropriée (par exemple, 8192 comme suggéré par Benji dans les commentaires).
  • Désactivez les citations magiques si nécessaire.
  • Définissez mb_http_output('pass') pour des performances optimales.
  • Utilisez les en-têtes appropriés liés au contenu :

    • Content-Type : application/zip
    • Content-disposition : pièce jointe ; filename="file.zip"

Malheureusement, il n'est pas simple de définir un en-tête pour indiquer la longueur du contenu en streaming ou inconnue dans ce contexte.

Remarque sur flush() :

Il est important de noter que l'appel de flush() dans la boucle de lecture/écho peut entraîner des problèmes avec des fichiers volumineux et des réseaux lents en raison du dépassement du tampon de sortie interne d'Apache. Par conséquent, il est préférable d’omettre les appels flush() dans le code.

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