2011-01-11 4 views
0

J'ai un script PHP (exécutant PHP 5.2 sur Apache 2.2) qui crée une archive zip de fichiers qu'un utilisateur peut télécharger. Tout semble fonctionner très bien; le seul problème que j'ai est que périodiquement plusieurs fichiers seront créés avant que l'archive ZIP soit terminée avec succès. Exemple:PHP Zip Archive crée sporadiquement plusieurs fichiers

archive-name.zip

archive name.zip.a09600

archive name.zip.b09600

archive name.zip.c09600

Cela ne pas arrivé à chaque fois; seulement périodiquement - le fichier est toujours créé, mais parfois ces «fichiers» supplémentaires sont laissés sur le serveur après la fin. Le code qui crée l'archive ZIP est le suivant:

 $zip_archive = new ZipArchive(); 
     $zip_archive->open($archiveFullName,ZIPARCHIVE::CREATE); 

     if(!file_exists($archiveFullName)) { 
      foreach ($completed_file_arr as $zip_file) { 
       $isFiller = substr($zip_file,-8) == "_err.txt"; 
       if(!$isFiller) { 
        $zip_archive->addFile($zip_file,$localname); 
       } else $zip_archive->addFromString ($zip_file, "The requested source file could not be found."); 
      } 
     } 

     while(!$zip_archive->close()) sleep(1); //ensure that the ZIP file finishes closing 
+0

Après la création de cette archive ZIP; la page est rechargée en utilisant javascript. La page vérifie si un fichier a été créé (et existe) et si c'est le cas, il sert au téléchargement. Ce qui semble se passer, c'est que le fichier ZIP est fermé avec succès avec $ zip_archive-> close() mais le fichier ne se termine pas. Ainsi, lorsque la page se recharge en recherchant archive-name.zip, la seule chose qui existe est archive-name.zip.a09600; donc il descend dans le segment de création ZIP du code jusqu'à ce qu'il le fasse correctement. Je ne sais pas ce qui pourrait être à l'origine de la fermeture de l'archive ZIP. – Dogoferis

Répondre

0

Cela s'est avéré être un problème lié à la session; les données de session ne sont pas enregistrées lors du premier passage en raison d'appels à une fonction située plus haut dans le code qui appelle session_write_close() plusieurs fois (contournement d'un bogue connu avec exec()). Le problème était de préserver/récupérer les données après la reprise de la session après cela.

Questions connexes