6
votes

Décompresser des fichiers plus gros avec PHP

J'essaie de décompresser une archive de 14 Mo avec PHP avec du code comme celui-ci: XXX PRE>

Il échoue sur mon localhost avec une limite de mémoire de 128 Mo avec la taille classique " de la mémoire de la mémoire autorisée de Blablabla octets épuisés code> ". Sur le serveur, j'ai une limite de 16 Mo, y a-t-il un meilleur moyen de le faire afin que je puisse vous intégrer à cette limite? Je ne vois pas pourquoi cela doit allouer plus de 128 Mo de mémoire. Merci d'avance. P>

Solution: strong> J'ai commencé à lire les fichiers dans des morceaux de 10kb, problème résolu avec l'utilisation de la mémoire maximale Arnoud 1.5MB. P>

        $filename = 'c:\kosmas.zip';
        $archive = zip_open($filename);
        while($entry = zip_read($archive)){
            $size = zip_entry_filesize($entry);
            $name = zip_entry_name($entry);
            $unzipped = fopen('c:/unzip/'.$name,'wb');
            while($size > 0){
                $chunkSize = ($size > 10240) ? 10240 : $size;
                $size -= $chunkSize;
                $chunk = zip_entry_read($entry, $chunkSize);
                if($chunk !== false) fwrite($unzipped, $chunk);
            }

            fclose($unzipped);
        }


3 commentaires

Quelle est la taille non compressée du fichier zip?


Utilise des outils de ligne de commande une option?


La taille non compressée est d'environ 110 Mo. Malheureusement, l'utilisation de la ligne de commande n'est pas une option.


4 Réponses :


1
votes

Juste parce qu'un zip est inférieur à la limite de mémoire de PHP et peut-être que le décapage est également décentralisé, ne tient pas compte des frais généraux de PHP de manière générale et plus important encore, la mémoire nécessaire pour décompresser réellement le fichier, tandis que je ne suis pas expert avec Compression je m'attendais à ce que vous puissiez bien être beaucoup plus que la taille finale non cuite.


1 commentaires

Oui, mais il semble toujours y avoir une alternative, c'est-à-dire que je peux ungzip beaucoup plus grandes archives avec une utilisation de la mémoire maximale inférieure à 1 Mo, je peux analyser le fichier XML de 1,5 Go avec une utilisation de la mémoire maximale inférieure à 3 Mo, pourquoi ne pouvait-il pas y avoir une telle alternative pour Fichiers zip ...



0
votes

Pour un fichier de cette taille, il est peut-être préférable que vous utilisiez < Code> shell_exec () à la place: xxx

php doit pas être exécuté en mode sans échec et que vous devez avoir accès à coque_exec et Unzip pour cette méthode pour fonctionner.

Mise à jour :

Étant donné que les outils de ligne de commande ne sont pas disponibles, tout ce que je peux penser, c'est créer un script et Envoyez le fichier sur un serveur distant où les outils de ligne de commande sont disponibles sont disponibles, extrayez le fichier et téléchargez le contenu.


2 commentaires

Malheureusement, les outils de ligne de commande sont désactivés par le serveur.


@Anax C'est pourquoi PHP obtient une mauvaise enveloppe. Pourquoi une demande de production doit-elle jamais avoir besoin d'exécuter Commandline Args? C'est la source principale de tant de vers PHP.



5
votes

Pourquoi lisez-vous l'ensemble du fichier à la fois? XXX

Essayez de lire de petits morceaux de celui-ci et de les écrire à un fichier.


1 commentaires

C'est exactement ce que j'ai fait et je vais poster la solution dans une minute, si quelqu'un est intéressé.



0
votes
function my_unzip($full_pathname){

    $unzipped_content = '';
    $zd = gzopen($full_pathname, "r");

    while ($zip_file = gzread($zd, 10000000)){
        $unzipped_content.= $zip_file;
    }

    gzclose($zd);

    return $unzipped_content;

}

2 commentaires

Toute explication ou raisonnement derrière cette solution pourrait être utile pour comprendre le problème.


En outre, cela a été répondu à 4 il y a des années.