Fonction exec()

Eléphanteau du PHP | 18 Messages

20 juil. 2009, 21:27

Bonjour,

J'ai un fichier .bat que je souhaite lancer avec la commande exec :

Code : Tout sélectionner

exec("'ressources/ModuleExport.bat 2 1 F:/test.tif'",$str_ret, $flag);
Le .bat marche sous une invite de commande Dos : ModuleExport.bat 2 1 F:/test.tif
dans le repertoire correspondant, mais pas avec la fonction exec...

$flag est toujours = 1.

voici le contenu du .bat :

Code : Tout sélectionner

java -Xmx1024M -jar ModuleExport.jar %1 %2 %3
Avez vous des idées concernant mon probleme?

Merci d'avance.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 juil. 2009, 21:41

La fonction exec() attend une chaine en paramètre qu'elle va exécuter... or toi tu lui passe une chaine (entre guillemets) qui contient une chaine (entre apostrophes). Résultat le dos ne la reconnait pas comme une commande et ne peut l'exécuter...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 18 Messages

20 juil. 2009, 21:48

J'ai testé sans les guillemets même résultat..

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 juil. 2009, 22:23

Et as-tu regardé ce que contient $str_ret ? et ce que retourne exec() ?
Puisqu'il ne s'agit plus de commande php, il serait utile de récupérer les éventuels messages d'erreur :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 18 Messages

21 juil. 2009, 20:03

Oui str_ret renvoie Array(), exec renvoie rien et flag renvoie 1.
Mais ce qui est bizarre c'est que quand je l'exécute avec une commande ms dos ca fonctionne.

ViPHP
ViPHP | 5924 Messages

21 juil. 2009, 20:50

Oui str_ret renvoie Array()
1/ Ya pas quelquechose qui te mets la puce à l'oreille ?
2/ RTFM : exec()

Eléphanteau du PHP | 18 Messages

21 juil. 2009, 20:56

renvoie array quand je l'affiche avec print_r pardon

ViPHP
ViPHP | 5924 Messages

21 juil. 2009, 21:07

var_dump() est ton ami :)

Eléphanteau du PHP | 18 Messages

21 juil. 2009, 21:23

Mais qu'est ce que tu racontes? mon probleme c'est pas l'affichage d'une variable mais l'éxecution d'un bat. Bref j'avance un peu finalement j'ai mis directement ca dans le code (je ne passe plus par le .bat):

Code : Tout sélectionner

exec("java -Xmx1024M -jar ModuleExport.jar 2 1 F:/t.tif",$str_ret, $flag);
mais le programme tourne en boucle sans s'arreter.
Je continue les recherches.

EDIT: mon programme consomme pas mal de ressources serai-ce du a ca?
il faut que je regle le xmx au minimum a 256m sinon le programme java crash
(java heap space).

EDIT2: j'ai tester avec un simple

Code : Tout sélectionner

System.out.println("test");
dans le main et la ca fonctionne, donc ca doit etre bel et bien du a l'allocation de mémoire
pour l'exécution des programmes...

EDIT3: j'ai règlé le memory_limit a 512M (ce qui est suffisant pour mon programme)
dans le php.ini et vérifié dans le phpinfo() c'est bon.
Par contre on dirai qu'il ne le prends pas en compte.. quand je regarde dans le
gestionnaire de taches -> processus lorsque j'éxécute le prog via php il consomme
pas plus de ~20M (insuffisant) alors que avec une commande ms dos il consomme
~250M et fonctionne.

EDIT4: bon ben apparemment ca va pas etre possible... voici l'erreur que j'obtiens :
Fatal error: Allowed memory size of 512000 bytes exhausted (tried to allocate 24576 bytes) in D:\Program Files\ms4w\apps\Atlas\fonctions\fn_legende.php on line 21
j'ai aussi essayé avec 524288000 mais ca marche pas non plus ca alloue toujours pas plus de 20meg

Merci.
Modifié en dernier par djutopie le 21 juil. 2009, 23:11, modifié 1 fois.

ViPHP
ViPHP | 5924 Messages

21 juil. 2009, 23:08

Mais qu'est ce que tu racontes? mon probleme c'est pas l'affichage d'une variable mais l'éxecution d'un bat.
Ouh, attention, ne dépasse pas les bornes hein :)
J'ai très bien compris ton problème. Seulement on essaye de t'apprendre à débugguer. Donc au lieu de caractériser ton impatience en essayant de nous faire croire qu'on ne sait pas ce qu'on dit, remets toi plutôt en question. :)
Parce que, d'une part, si tu avais appliqué mon conseil, en plus de régler le problème, tu saurais pourquoi ça ne marchait pas, et d'autre part, si tu savais utiliser un var_dump(), lire la doc, et chercher avec google, tu n'aurais même pas eu besoin de venir poster ici, puisque tu aurais réglé le problème depuis longtemps.

Donc si tu viens ici, ne remets pas en cause nos conseils :)
EDIT3: j'ai règlé le memory_limit a 512M (ce qui est suffisant pour mon programme)
dans le php.ini et vérifié dans le phpinfo() c'est bon.
Par contre on dirai qu'il ne le prends pas en compte.. quand je regarde dans le
gestionnaire de taches -> processus lorsque j'éxécute le prog via php il consomme
pas plus de ~20M (insuffisant) alors que avec une commande ms dos il consomme
~250M et fonctionne.
De un ne pas fonctionner, ça ne veut rien dire, quand ça fonctionne c'est qu'il y a un comportement anormal, donc différent, donc qui se décrit. Dans ce cas là il faut donner l'erreur, s'il n'y a pas d'erreur, vérifier que le niveau d'erreur est au maximum.
Pour le débuggage, il faut garder un var_dump sur la sortie du script, donc le $str_ret. Il faut aussi faire des sorties sur le programme java si tu as la main dessus. Donc si possible, tu places des System.out.println() pour tracer le code et regarder où il s'arrête.
Tu parles du programme php. Tu exécutes php en ligne de commande ? Si c'est le cas, ce n'est peut être pas le même php.ini, donc utilise php -i et non le phpinfo().

ViPHP
ViPHP | 5924 Messages

21 juil. 2009, 23:09

EDIT4: bon ben apparemment ca va pas etre possible... voici l'erreur que j'obtiens :
Fatal error: Allowed memory size of 512000 bytes exhausted (tried to allocate 24576 bytes) in D:\Program Files\ms4w\apps\Atlas\fonctions\fn_legende.php on line 21
Donc tu as mis la limite à 512K et non 512M

Eléphanteau du PHP | 18 Messages

21 juil. 2009, 23:26

Pour le débuggage, il faut garder un var_dump sur la sortie du script, donc le $str_ret. Il faut aussi faire des sorties sur le programme java si tu as la main dessus. Donc si possible, tu places des System.out.println() pour tracer le code et regarder où il s'arrête.
mais le programme tourne en boucle sans s'arreter.
Donc tu as mis la limite à 512K et non 512M
j'ai aussi essayé avec 524288000 mais ca marche pas non plus ca alloue toujours pas plus de 20meg
Il faut aussi faire des sorties sur le programme java
Ca fini par un System.exit(0) mais le probleme viens surement de php vu qu'avec
Ms-dos "l'éxécution se déroule correctement avec un magnifique exit".

D'autre part je ne vois pas la diff entre print_r et var_dump..
cf. post #7.

ViPHP
ViPHP | 5924 Messages

21 juil. 2009, 23:35

Tu parles du programme php. Tu exécutes php en ligne de commande ?

ViPHP
ViPHP | 5924 Messages

21 juil. 2009, 23:40

mais le programme tourne en boucle sans s'arreter.
Est ce que c'est son exécution normale ?
Trace le au besoin pour savoir pourquoi il boucle.
Ca fini par un System.exit(0) mais le probleme viens surement de php vu qu'avec
Ms-dos "l'éxécution se déroule correctement avec un magnifique exit".
D'où vient ce System.exit(0). Est ce qu'il signifie une erreur. A vrai dire, on s'en fout de son code d'erreur (sauf si le code d'erreur est documenté). Ce qui importe, c'est ce qui a causé la fin du programme.
D'autre part je ne vois pas la diff entre print_r et var_dump.
var_dump() est la plupart du temps plus détaillé, mais en l'occurrence, si le tableau est vide, le tableau est vide…

Eléphanteau du PHP | 18 Messages

21 juil. 2009, 23:46

djutopie a écrit:
mais le programme tourne en boucle sans s'arreter.

Est ce que c'est son exécution normale ?
Trace le au besoin pour savoir pourquoi il boucle.
Non j'avais dit qu'il s'arretait correctement avec une console ms-dos donc je suis sur qu'il marche.

---
D'où vient ce System.exit(0). Est ce qu'il signifie une erreur. A vrai dire, on s'en fout de son code d'erreur (sauf si le code d'erreur est documenté). Ce qui importe, c'est ce qui a causé la fin du programme.
Il est a la fin du programme pour signaler que tout s'est bien passé. Par convention le code
sortie 0 signifie cela.

---
var_dump() est la plupart du temps plus détaillé, mais en l'occurrence, si le tableau est vide, le tableau est vide…
alors je comprends toujours pas alors pourquoi t'a répondu
var_dump() est ton ami Smile
a mon post :
renvoie array quand je l'affiche avec print_r pardon
---
Tu parles du programme php. Tu exécutes php en ligne de commande ?
J'ai un serveur apache en local, et je n'éxecute pas en ligne de commande j'ai des
fichiers php codé avec bloc-note.

---

Mais je suis persuadé que l'erreur vient de l'allocation mémoire car quand j'éxecute
sous ms dos avec -xmx<256M ca boucle aussi enfin du moins le programme ne se termine pas.
Donc il me faudrait ce moyen de pouvoir règler ce paramètre mais malheuresement
memory_limit n'a pas l'air chaud de faire ce que je lui demande :P

---

EDIT : Bon en fait j'ai trouvé... Le programme java prenait des chemins absolus et du
coup vu que je lançait "java -jar ressources/monfic.jar..." il trouvait pas les bon path.


Merci pour votre aide
Modifié en dernier par djutopie le 22 juil. 2009, 17:12, modifié 4 fois.