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 sans créer de fichiers temporaires ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-07 14:42:03374parcourir

How to Stream Zip Files Dynamically on a LAMP Stack Without Creating Temporary Files?

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!

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