9 votes

Abandon de PHP lors de la création d'un gros fichier .zip

Mon script s'exécute sous CentOS 5.6 et PHP 5.2.12 et utilise ZipArchive() pour créer avec succès des fichiers .zip de plus de 1,6 Go, mais pas pour une archive plus grande de 2 Go ou plus - PHP s'arrête sans erreur apparente. Rien dans le journal des erreurs de PHP ou dans stderr. Le script est exécuté à la ligne cmd et non de manière interactive.

Le script s'exécute pendant environ 8min et l'archive temporaire s'agrandit et en vérifiant la taille des fichiers, le dernier listing montrait que le fichier tmp avait une taille de 2120011776 et ensuite le fichier tmp disparaît et le script PHP passe à travers la logique et exécute le code après la création de l'archive.

Pour une raison quelconque, top montre que le CPU est toujours à 95% et crée un nouveau fichier d'archive tmp - il le fait pendant encore 5+ minutes et s'arrête silencieusement en laissant le fichier d'archive tmp inachevé. Dans ce test, il y avait moins de 4000 fichiers attendus.

Le script comme indiqué fonctionne très bien en créant des fichiers d'archives plus petits.

Testé sur plusieurs ensembles différents de données sources volumineuses - même résultat pour les fichiers volumineux.

Ce problème ressemble à cette question : Limite de taille de la classe zipArchive de PHP ?

J'ai pensé que la commande ls -l renvoyait peut-être un compte de 2K blocs et que 2120011776 serait donc proche de 4GB mais cette taille est en octets - la taille du fichier xxxx.zip.tmpxx.

Merci !

3voto

Ça peut être beaucoup de choses. Je suppose que vous avez suffisamment d'espace disque libre pour gérer le processus. Comme d'autres l'ont mentionné, il pourrait y avoir des problèmes corrigés soit en modifiant votre fichier php.ini, soit en utilisant la fonction ini_set() dans le code lui-même.

Quelle est la quantité de mémoire dont dispose votre machine ? S'il épuise votre mémoire réelle, il est logique qu'il s'interrompe régulièrement après une certaine taille. Vérifiez donc l'utilisation de la mémoire libre avant le script et surveillez-la pendant l'exécution du script.

Une troisième option pourrait être basée sur le système de fichiers lui-même. Je n'ai pas beaucoup d'expérience avec CentOS, mais certains systèmes de fichiers n'autorisent pas les fichiers de plus de 2 Go. Bien que, d'après le page du produit il semble que la plupart des systèmes sur CentOS peuvent le gérer.

Une quatrième option, qui semble être la plus prometteuse, apparaît si vous regardez la page du produit liée ci-dessus, un autre coupable possible est "l'espace d'adresse virtuelle maximum x86 par processus", qui est d'environ 3 Go. x86_64 est d'environ 2 To, donc vérifiez le type de processeur.

Encore une fois, il semble que la quatrième option soit la coupable.

-1voto

user3246030 Points 11

Avez-vous utilisé les variables set_limit en php.

Vous pouvez utiliser le . Htacess ou dans le script de PHP. A l'intérieur du script set_time_limit(0) ; Dans le .htaccess php_value memory_limit 214572800 ;

-1voto

PrivateAgent Points 17

Lorsque votre fichier est de grande taille, il prendra du temps pour faire son archive ZIP, mais en PHP (php.ini) le temps d'exécution maximum, donc vous devez essayer d'augmenter cette valeur.

-2voto

Sourav Points 4119

Il y a un paramètre dans le php.ini pour le temps d'exécution maximum.
c'est peut-être ça, se faire virer !
essayez d'augmenter la valeur !

Il y a aussi une limite de taille de fichier différente selon le système d'exploitation, essayez de vérifier cela aussi !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X