Position actuelle: Accueil> Derniers articles> La fonction zip_read () de PHP se bloque lors du traitement des fichiers volumineux. Que dois-je faire? Comment résoudre le problème de l'écrasement lorsque zip_read () lit de gros fichiers?

La fonction zip_read () de PHP se bloque lors du traitement des fichiers volumineux. Que dois-je faire? Comment résoudre le problème de l'écrasement lorsque zip_read () lit de gros fichiers?

M66 2025-07-18

Lorsque vous utilisez la fonction zip_read () de PHP pour lire des fichiers compressés ZIP, en particulier lorsque le fichier est très grand, de nombreux développeurs rencontrent des problèmes tels que le crash du programme, le débordement de la mémoire ou le délai d'exécution. Cet article analysera en détail les raisons pour lesquelles la fonction zip_read () se bloque lors du traitement des fichiers volumineuses et fournit des solutions efficaces pour vous aider à gérer avec succès les archives ZIP de fichiers.

1. Analyse de la cause du problème

  1. Limite de mémoire
    La limite de mémoire par défaut de PHP est généralement faible, et la valeur par défaut est généralement de 128 Mo ou 256 Mo. Lors du traitement des fichiers volumineux, zip_read () doit charger des informations sur les fichiers en mémoire, ce qui entraîne une forte augmentation de l'utilisation de la mémoire. Le programme s'écrasera après avoir dépassé la limite.

  2. Limite de temps d'exécution
    Le temps d'exécution maximum par défaut des scripts PHP est de 30 secondes. Le fonctionnement de lecture des fichiers volumineux peut dépasser cette fois, ce qui fait que le script terminait le délai d'attente.

  3. Les limites de zip_read () elle-même
    zip_read () est implémenté en fonction de la bibliothèque Libzip . Bien qu'il soit simple et facile à utiliser, il n'est pas suffisamment efficace pour la lecture et le traitement de fichiers super volumineux, en particulier lorsque la structure interne du fichier est complexe ou que le taux de compression est élevé.

  4. Goulot d'étranglement d'E / S disque <br> La lecture de fichiers volumineux implique un grand nombre d'opérations de disque. Si les performances du disque sont insuffisantes ou si les fichiers sont stockés sur des disques réseau, il peut également provoquer un décalage ou même des plantages.

2. Solution

1. Ajuster la configuration PHP

Lors du traitement des fichiers volumineux, ajustez d'abord la configuration de l'environnement de fonctionnement PHP:

 ini_set('memory_limit', '1024M'); // Augmenter la limite de mémoire à1GBOu plus
set_time_limit(0); // Annuler la limite de temps d&#39;exécution,Évitez les délais d&#39;attente

Cela garantit que le script a suffisamment de ressources pour terminer la tâche.

2. Utilisez zip_open () et zip_read () combiné à la lecture en streaming

Évitez de charger l'intégralité du contenu de fichier à la fois et utilisez la lecture en streaming pour traiter les fichiers dans un zip un par un.

Exemple de code:

 <?php
$zipPath = "http://m66.net/path/to/your/largefile.zip";

$zip = zip_open($zipPath);
if ($zip) {
    while ($zipEntry = zip_read($zip)) {
        $entryName = zip_entry_name($zipEntry);
        if (zip_entry_open($zip, $zipEntry)) {
            $size = zip_entry_filesize($zipEntry);
            $contents = '';
            while ($size > 0) {
                $readSize = 1024 * 1024; // Chaque lecture1MB
                $buffer = zip_entry_read($zipEntry, min($readSize, $size));
                if ($buffer === false) break;
                $contents .= $buffer;
                $size -= strlen($buffer);
            }
            // traiter avec$contents,Par exemple, enregistrer des fichiers ou analyser les données
            zip_entry_close($zipEntry);
        }
    }
    zip_close($zip);
} else {
    echo "Impossible d&#39;ouvrirZIPdocument";
}
?>

Cela peut éviter une lecture de mémoire excessive à la fois.

3. Utilisez une bibliothèque d'opération zip plus efficace

La fonction Zip_Read () intégrée de PHP est limitée et il est recommandé d'utiliser des extensions plus puissantes et stables telles que:

  • Ziparsive
    La classe Ziparchive fournit une interface de fonctionnement de fichiers zip plus complète et plus efficace et a une meilleure prise en charge des fichiers volumineux.

Exemple de code:

 <?php
$zipPath = "http://m66.net/path/to/your/largefile.zip";
$zip = new ZipArchive();

if ($zip->open($zipPath) === TRUE) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $stat = $zip->statIndex($i);
        $filename = $stat['name'];

        $stream = $zip->getStream($filename);
        if (!$stream) {
            echo "无法Liredocument: $filename\n";
            continue;
        }

        while (!feof($stream)) {
            $buffer = fread($stream, 1024 * 1024); // Lire1MBdonnées
            // traiter avec$buffer
        }
        fclose($stream);
    }
    $zip->close();
} else {
    echo "Impossible d&#39;ouvrirZIPdocument";
}
?>

L'utilisation de ziparchive peut mieux contrôler la mémoire, diffuser la lecture et avoir une bonne compatibilité.

4. Clipter les fichiers volumineux ou les prétraiter

Si vous pouvez contrôler la source des fichiers zip, il est recommandé de diviser le grand fichier en plusieurs petits fichiers pendant la phase de génération, ou de stocker certains blocs dans le package compressé pour un traitement par lots faciles.

5. Optimisation de l'environnement du serveur

Assurez-vous que les performances des E / S du disque du serveur sont bonnes et évitez les goulots d'étranglement lors de la lecture de fichiers volumineux. De plus, l'ajustement de la stratégie de mise en cache des fichiers du système d'exploitation peut également améliorer les performances de la lecture des fichiers grands.

3. Résumé

  • Lorsque zip_read () se bloque dans la gestion des fichiers volumineux, la première étape consiste à vérifier la mémoire et la configuration du temps d'exécution de PHP.

  • Essayez d'utiliser la lecture en streaming pour éviter de lire le fichier entier à la fois.

  • Il est recommandé d'utiliser Ziparchive au lieu de zip_read () , ce qui est plus efficace et stable.

  • Prétraitez la structure du fichier compressé pour réduire la quantité de données traitées en un seul temps.

  • Optimiser l'environnement du serveur pour assurer les performances d'E / S.

Les méthodes ci-dessus peuvent réduire considérablement le risque de plantages lors du traitement des fichiers volumineux à zip et améliorer la stabilité et l'efficacité du programme.