!i! RESOLU !i! fonction exec() attente fin du prog

!i! RESOLU !i! fonction exec() attente fin du prog - PHP - Programmation

Marsh Posté le 09-02-2006 à 13:36:13    

Voila je doit lancer un .exe (programme C) à partir d'une page PHP, j'utilise donc la fonction :

Code :
  1. exec('C:\GSM\Timer.exe');


   
  Ce programme C (timer.exe) execute un fichier bat regulierement pendant 1H , donc ma page PHP se bloque etant donné que l'execution est longue.
  Après differentes rechezrches je pense que pour faire executer le timer en ariere plan sans pour autant figer ma page php est d'utiliser l'argument "nohup" mais je ne sais pas comment l'utiliser.
  Alors voilà est ce que cette méthode est bonne pour lancer mon programme et qu'il s'execute jusqu'à la fin sans figer la page PHP ?? si oui comment utiliser cette fonction ?? si non HELPPPP !!
 
Merci ...


Message édité par lyzergik25 le 13-02-2006 à 15:17:25
Reply

Marsh Posté le 09-02-2006 à 13:36:13   

Reply

Marsh Posté le 09-02-2006 à 13:58:01    

D'après la doc:

Citation :


Note : Si vous démarrez un programme en utilisant cette fonction et que vous voulez le laisser tourner en arrière plan, vous devez vous assurer que la sortie du programme est redirigée vers un fichier, ou un autre flux de sortie, sinon PHP attendra jusqu'à la fin de l'exécution du programme.

Reply

Marsh Posté le 09-02-2006 à 14:38:52    

Merci pour cette info anapajari mais j'ai déjà consulté ces differentes docs et je ne sais pas comment faire ... j'attends une aide un peu plus concrète ... merci malgré tout anapajari pour t'être penché sur mon problème ...

Reply

Marsh Posté le 09-02-2006 à 14:57:18    

Il faudrait donc que je puisse rediriger la sortie du "exec" vers un fichier ?!! comment faire ??
Il n'y aurait pas une autre manière ... le "nohup" ca ne vous parle pas ?
 

Reply

Marsh Posté le 09-02-2006 à 14:59:35    

sinon tu execute la command "start" qui lancera ton timer.exe et php n'attendra normalement plus rien puisque start se sera terminée.
Je n'en suis pas certain mais il me semble que ca devrait fonctionner.

Reply

Marsh Posté le 09-02-2006 à 15:00:41    

Code :
  1. exec('C:\GSM\Timer.exe >fichierdesortie.txt >>fichierderreur.txt');


Pour le ">", je sais que windows le reconais, pour le >>, je n'en sais rien.
 
Quand à ton "nohup", t'as vu ça où, je le vois pas dans la doc à premiére vue?

Reply

Marsh Posté le 09-02-2006 à 15:01:23    

merci omega2 je vais tester ca :)

Reply

Marsh Posté le 09-02-2006 à 15:04:28    

aparament cela ne change rien , la page PHP se fige parce que le programme timer.exe mets une heure avant d'arriver à son terme.
AAhh je craque , il faut que j'arrive à faire tourner ca pour 17h !!

Reply

Marsh Posté le 09-02-2006 à 15:07:55    

dwogsi ... qu'entends tu par la commande "start" ?? Je ne pense pas que cela soit une fonction PHP , je ne m'en sort pas ... H - 2

Reply

Marsh Posté le 09-02-2006 à 15:09:10    

Idée bête : essaye

Code :
  1. exec('C:\GSM\Timer.exe &" );


Sur un serveur de type unix, ca lance le programme en fond de tache et ca rend la main immédiatement. mais si tu veux voir ce que raconte le programme, il faut rediriger les sorties vers un fichier comme plus haut.


Message édité par omega2 le 09-02-2006 à 15:09:20
Reply

Marsh Posté le 09-02-2006 à 15:09:10   

Reply

Marsh Posté le 09-02-2006 à 15:13:22    

lyzergik25 a écrit :

dwogsi ... qu'entends tu par la commande "start" ?? Je ne pense pas que cela soit une fonction PHP , je ne m'en sort pas ... H - 2


 
Start est une command DOS (si mes souvenir sont bons) qui sert à exécuter un programme mais sans attendre que celui-ci se termine. Autrement dit, start exécute le programme qu'on lui demande puis s'arrête.
 
Donc en dos pour lancer explorer :
start explorer
 
Donc en php :
exec("start explorer" ) // ca marche chez moi

Reply

Marsh Posté le 09-02-2006 à 15:15:09    

Merci a vous deux , je m'en vais tester tout ceci tout de suite :)

Reply

Marsh Posté le 09-02-2006 à 15:17:28    

Juste par curiosité j'ai testé ça : exec("command &" );
Et bien l'interprêteur ne reconnait plus les commandes externes....
Omega? t'es sur que ca fait pas d'autres choses que ce que tu as dit le "&"??

Reply

Marsh Posté le 09-02-2006 à 15:25:59    

 Donc j'ai essayé ce que tu m'as proposé dwogsi , du coup cela me lance bien le "timer.exe" dans une fenetre séparée alors qu'en faisant un exec simple , le programme se lancait en tache de fond.  
  Le problème de l'attente d'une réponse du programme par la page php persiste.
  Si je clike sur "arreter" dans le naviguateur ca stoppe bien l'attente de la page PHP et le programme tourne tout de même mais bon je doute qu'un utilisateur lamda comprenne ce qu'il se passe , car si on patiente la page affiche "délai dépassé etc .. etc..." mais au niveau du fonctionnement du programme aucun problème une fois lancé il roule jusqu'au bout. aaaah 3h25

Reply

Marsh Posté le 09-02-2006 à 15:38:52    

Aprés test, windows ne reconais pas le caractére "&" en ligne de commande.
En fouillant dans la doc du côté de la création de la programmation avec plusieurs process en paralléle et je suis tombé sur ça : "popen ()"

Citation :

popen() ouvre un processus fils en faisant un fork de la commande command.  
 
popen() retourne un pointeur de fichier identique à celui retourné par fopen(), hormis le fait qu'il sera unidirectionnel (lecture seule, ou écriture seule), et doit être terminé par pclose(). Ce pointeur peut être utilisé avec fgets(), fgetss() et fputs().  


Un fork lancant un autre programme est exactement ce que tu cherches.


Message édité par omega2 le 09-02-2006 à 15:39:06
Reply

Marsh Posté le 09-02-2006 à 15:42:34    

je vais chercher la syntaxe de popen et tester ca mais il me semble avoir deja essayé .... ( Jai tellement essayé de choses différentes ...)  
:) j'espère un resultat

Reply

Marsh Posté le 09-02-2006 à 15:45:05    

Tu es bien certain que le "&" ne fonctionne pas en ligne de commande sur Windows? Parceque si je fais un :  
format &
il me dis qu'il n'y a pas de paramètre mais si je fais un
format ¤
il me dit que le paramètre est in correcte, nuance...

Reply

Marsh Posté le 09-02-2006 à 15:45:07    

Non aucun résultat avec :    
 
popen("C:\GSM\Timer.exe" );
 
Le timer ne se lance même pas avec cette commande . . .


Message édité par lyzergik25 le 09-02-2006 à 15:46:26
Reply

Marsh Posté le 09-02-2006 à 15:46:07    

Ba sinon tu te code une petite appli qui exécute ton timer.exe.

Reply

Marsh Posté le 09-02-2006 à 15:47:29    

Le truc c'est que je dois executer a partir de ma page PHP ce timer , l'utilisateur doit pouvoir lancer cette appli (pour 1h) quand il le souhaite

Reply

Marsh Posté le 09-02-2006 à 15:49:10    

Mais pourquoi tu balance pas la sortie vers un fichier tout simplement???

Reply

Marsh Posté le 09-02-2006 à 15:54:36    

comme ceci ??
 
exec("C:\GSM\Timer.exe" >sortie.txt);   ????
 
comment utiliser ce fichier de sortie ??

Reply

Marsh Posté le 09-02-2006 à 15:57:03    

Tu met ca :
exec("C:\GSM\Timer.exe" >sortie.txt);
 
ensuite s'i y a sortie ca ecrira un fichier et sinon rien mais le fichier tu t'en fou. Tu le supprime au besoin.

Reply

Marsh Posté le 09-02-2006 à 16:02:21    

exec("C:\GSM\Timer.exe" >sortie.txt);  
 
ne fonctionne pas , il doit y avoir une erreur de syntaxe pour rediriger vers un fichier de sortie !

Reply

Marsh Posté le 09-02-2006 à 16:06:33    

désolé j'avais pas vu comme tu avais mis tes quote en c'est plutot ca :
exec("C:\GSM\Timer.exe >sortie.txt" );


Message édité par dwogsi le 09-02-2006 à 16:07:25
Reply

Marsh Posté le 09-02-2006 à 16:09:53    

Figure toi que j'ai déja essayé , cela lance bien le programme mais toujours cette attente sur la page PHP j'en puis plus ... en + ya que toi qui est solidaire lol ...:'|

Reply

Marsh Posté le 09-02-2006 à 16:16:56    

Étrange parceque moi ça avait résole le problème pour un tcpdump, j'avais tout simplement mis :
exec("tcmpdump -D > list_chn.txt" );
 
Et ca marche à merveille. Elle fait quoi exactement l'appli que tu cherche à exécuter? T'as la source?

Reply

Marsh Posté le 09-02-2006 à 16:22:25    

oui j'ai le code source , c'est moi qui l'ai codé , je t'explique ... c'est tout simplement un timer qui execute un fichier .bat toutes les 2 minutes pendant 1heure ensuite il s'arrete.
 
Logiquement d'apres ce que je lis sur le net :  
 
  >>>>      Note : Si vous démarrez un programme en utilisant cette fonction et que vous voulez le laisser tourner en arrière plan, vous devez vous assurer que la sortie du programme est redirigée vers un fichier, ou un autre flux de sortie, sinon PHP attendra jusqu'à la fin de l'exécution du programme.
 
Logiquement rediriger vers un fichier de sortie empêcherais de faire pédaler ma page PHP dans le vide .. mais bon aucune différence entre
 
exec("C:\GSM\Timer.exe" );
et
exec("C:\GSM\Timer.exe >sortie.txt" );

Reply

Marsh Posté le 09-02-2006 à 16:35:18    

Bon sinon ce que tu peux essayer, c'est créé une seconde appli en C qui va exécuter ton Timer.exe et qui se terminera ensuite.
 
En plus tu pourrais aussi vérifier si timer.exe s'est bien lancé et renvoyer TRUE ou FALSE selon les cas, récupérer ca dans php et afficher une erreur si besoin.

Reply

Marsh Posté le 09-02-2006 à 17:10:02    

dwogsi a écrit :

Tu es bien certain que le "&" ne fonctionne pas en ligne de commande sur Windows? Parceque si je fais un :  
format &
il me dis qu'il n'y a pas de paramètre mais si je fais un
format ¤
il me dit que le paramètre est in correcte, nuance...


J'ai testé avec le programme "php.exe" vu que si on lui donne aucun paramettre, il attend qu'on saisisse du texte sur l'entré standard.
Si windows gérait le "&" comme n'importe quel unix, alors il m'aurait rendu la main dessuite malgré l'attente de php mais là, il attendait que php ai finis son boulot. En bref, "&" ne se préoccupe pas de ce caractére. Il s'en contrefiche.
 
lyzergik25 > C'estpas un probléme de solidarité mais de nombre d'idée. Et là, j'en ai plus.

Reply

Marsh Posté le 09-02-2006 à 17:15:03    

Je pense que le "&" doit avoir un sens sous windows, mais pas le même que sur Unix car son utilisation produit des résultats pour le moins étranges.

Reply

Marsh Posté le 09-02-2006 à 17:39:43    

Suis pas expert en dos mais a vu de nez je dirais que "&" sert a executer plusieurs commandes en même temps:

Code :
  1. echo a & echo b


donne

Code :
  1. a
  2. b


alors que  

Code :
  1. echo a; echo b


donne

Code :
  1. a;echo b

Reply

Marsh Posté le 13-02-2006 à 11:23:26    

Toujours le meme probleme ... je resume ?? ou ... vous avez eu la force de lire ?

Reply

Marsh Posté le 13-02-2006 à 11:28:56    

j'ai un timer (en "C" ) qui execute un fichier .bat toutes les 2 minutes pendant 1heure ensuite il s'arrete .  
 
Sur ma page PHP j'utilise la fonction " exec(); " pour lancer le timer ;
 
Logiquement d'apres ce que je lis sur le net :  
 
  >>>>      Note : Si vous démarrez un programme en utilisant cette fonction et que vous voulez le laisser tourner en arrière plan, vous devez vous assurer que la sortie du programme est redirigée vers un fichier, ou un autre flux de sortie, sinon PHP attendra jusqu'à la fin de l'exécution du programme.  
 
Logiquement rediriger vers un fichier de sortie empêcherais de faire pédaler ma page PHP dans le vide .. mais bon aucune différence entre  
 
exec("C:\GSM\Timer.exe" );  
et  
exec("C:\GSM\Timer.exe >sortie.txt" );  
 
voilà en gros le problème est là !!

Reply

Marsh Posté le 13-02-2006 à 12:43:44    

pense a echapper les \ dans ta chaine de caractere (\ -> \\)

Reply

Marsh Posté le 13-02-2006 à 13:11:19    

Rien n'y fait la page PHP pedale toujours autant dans le vide

Reply

Marsh Posté le 13-02-2006 à 15:14:43    

Pour info j'ai résolu le problème en utilisant la fonction "psexec" lien >> http://www.sysinternals.com/Utilities/PsExec.html ;
Il faut copier le psexec.exe dans C:\Windows\System32 , cela permet d'utiliser cette commande en ligne de commande ... (est-ce bien clair , j'ai un doute lol..)
Ensuite j'ai donc fait un  " exec("psexec \\127.0.0.1 -d C:\GSM\timer.exe" ); "
Cela permet donc de lancer en arriere plan le programme et plus de blocage de la page PHP .... voila j'espère que ca pourra aider quelqun !!!

Reply

Marsh Posté le 13-02-2006 à 16:51:14    

lyzergik25 a écrit :

cela permet d'utiliser cette commande en ligne de commande ... (est-ce bien clair , j'ai un doute lol..)


Non ca permet d'utiliser la commande sans specifier le chemin absolu ou relatif pour peu que windows\system32 soit defini dans le path ... et il y est par defaut.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed