2017-01-28 2 views
0

Lorsque j'utilise PHP pourphp, exec, trier commande, fichier de sortie « apparaît » tronquée, mais le fichier d'entrée n'est pas complètement lu jusqu'à EOF

exec('sort /var/www/website/file_in.txt -o /var/www/website/file_out.txt');

le fichier qui est sortie de la commande de tri est trunacted

taille du fichier d'entrée

= 2442541

sortie de taille du fichier = 1.146.881


J'ai également remarqué, lors de l'utilisation de la fonction php filesize (file_in.txt), la valeur renvoyée = 1,146,881, pas la taille correcte comme indiqué dans une session de terminal. J'ai appelé clearstatcache() avant d'appeler filesize(). De manière intéressante, la taille de fichier indique la taille de file_in comme étant la même valeur que file_out est tronquée. Je cours une version PHP 64 bits de Linux _x86_64, donc j'ai pensé que cela élimine le problème de limitation de taille de fichier 32 bits pour les fichiers gt 2MB.


Quand je lance la commande de tri dans une session de terminal en tant que données www-utilisateur, le fichier de sortie est la même taille que le fichier d'entrée, pas de troncature.


J'ai essayé d'écrire un script shell pour appeler à partir exec, en espérant qu'il contournerait une limite tampon possible php, mais il a le même fichier de sortie tronquée.


J'ai TOP en cours d'exécution dans un terminal séparé pour regarder CPU et utilisation de la mémoire, mais depuis le coammdn lorsqu'il est exécuté dans un terminal ne tronque pas la sortie, ce qui semble être un problème de PHP.


Existe-t-il une configuration obscure de configuration .ini que je devrais vérifier pour résoudre ce problème?

Merci


Informations additionnelles: J'ai réalisé le fichier de sortie n'est pas tronquée, mais plutôt, le fichier d'entrée n'est pas lu dans son intégralité jusqu'à ce que EOF.

+1

Peut être cette aide: http://www.computerhope.com/unix/usort.htm, trouver une phrase "TAILLE peut être suivie par le suffixes multiplicatifs suivants " –

+0

merci pour votre suggestion, mais cette page Web ne liste même pas l'option -S (taille de tampon), qui est ce que SIZE se rapporte à. Cependant, lorsque vous avez étudié votre suggestion, j'ai trouvé cette page Web: https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html, qui donne une meilleure description de la taille de la mémoire tampon. utile. Je vais essayer le test de taille de tampon suivant. J'ai également appris qu'il existe une option --debug, qui peut aider à comprendre la troncature. –

+0

N.B> --debug ne peut pas être utilisé en même temps -o le fichier de sortie est utilisé. débogage utilise stndout (c'est-à-dire un écran de session terminal) –

Répondre

0

cela semble avoir été causé par un manque de mémoire disponible à ce stade de l'exécution du script php.

grâce à des tests, j'ai augmenté l'option de la commande SORT --buffer-size = 4K à partir de 4K, 5K, 10K, 40K, mais rien n'a été fait.

Je regardais TOP pour voir comment l'utilisation de la mémoire CPU était rapportée.

Je ne pensais pas que c'était un problème, donc je ne l'ai pas décrit dans ma question initiale, mais avant cette étape d'appeler SORT par EXEC, j'appelais pdftotext thru EXEC. Au fur et à mesure de l'exécution de ce processus, l'utilisation du processeur du serveur a atteint 98%. La mémoire a probablement également augmenté, mais le taux de rafraîchissement de TOP ne l'a pas capturé.

J'ai imaginé que je pouvais ajouter un sleep(5) avant l'appel de la commande SORT, pour mettre en pause l'exécution du script PHP, ce qui donnait du temps au CPU et à la mémoire pour revenir à la normale. Cela a résolu le problème de SORT en lisant tout le fichier d'entrée et en sortant tout son contenu. Cela a également résolu le résultat filesize() incorrect.

Dans un environnement de production, je vais créer un serveur avec plus de capacité et essayer d'éliminer le délai sleep(5). Je ne peux pas attendre jusqu'à ce que je reçois au niveau de démarrage "nouilles ramen" :)