2013-05-22 3 views
0

Je travaille sur l'extraction d'une archive zip avec PHP. La structure de l'archive est de sept dossiers, chacun contenant de l'ordre de 10 000 fichiers, chacun d'environ 1 Ko.Dézipper un fichier avec PHP, mais tous les fichiers ne sont pas extraits

Mon code est assez simple et utilise la classe ZipArchive:

$zip = new ZipArchive(); 
$result = $zip->open($filename); 
if ($result === true) { 
    $zip->extractTo($tmpdir); 
    $zip->close(); 
} 

Le problème que je vais avoir, cependant, est que l'extraction semble arrêter. Le premier dossier est entièrement extrait, mais seulement environ la moitié du second est. Aucun des cinq autres n'est extrait du tout.

J'ai aussi essayé d'utiliser ce code, qu'il se brise en morceaux de 10 ko à la fois, mais on m'a donné exactement le même résultat:

$archive = zip_open($filename); 
while ($entry = zip_read($archive)) { 
    $size = zip_entry_filesize($entry); 
    $name = zip_entry_name($entry); 
    if (substr($name, -1) == '/') { 
     if (!file_exists($tmpdir . $name)) mkdir($tmpdir . $name); 
    } else { 
     $unzipped = fopen($tmpdir . $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); 
    } 
} 

J'ai aussi essayé d'augmenter la limite de mémoire en PHP à partir de 512 Mo à 1024 Mo, mais encore une fois obtenu le même résultat. Unzipped tout est d'environ 100 Mo, donc je ne pense pas que ce soit un problème de mémoire de toute façon.

Répondre

0

Probablement son temps d'exécution maximum ... désactiver complètement la limite en la mettant à 0 ou définir une bonne valeur.

ini_set('max_execution_time', 10000); 

... DonT mis à 0 dans l'utilisation de la production ...

Si vous n'avez pas accès à ini_set() en raison de la directive disable_function vous pouvez avoir à modifier sa valeur dans votre php.ini directement.

+0

J'ai déjà un appel à set_time_limit(), et le script continue à traiter tout ce qui est passé sans problème. – Paul

Questions connexes