8791 sujets

Développement web côté serveur, CMS

Bonjour,

Je rencontre un problème: j'ai un script PHP dans lequel je fais appel à la fonction système "exec()" et qui lance un exécutable java .jar qui s'occupe de résoudre un problème complexe.

En fait, ça marche la plupart du temps sauf lorsque le problème est trop complexe et nécessite un temps de résolution plus long.

Le truc c'est que php ne lui laisse pas le temps de terminer...

J'ai donc pensé à augmenter dans un premier temps le max_execution_time de 30s à 600s ==> pareil !

Ensuite, j'ai essayé d'augmenter le max_input_time de 60s à 600s ==> toujours pareil, il ne laisse pas les 600s passer et s'arrête avant...

J'ai aussi essayé d'appeler set_time_limit(0); avant l'appel à exec: exec("monjar.jar"); et même essayé set_time_limit(1200); et c'est également pareil...

Je précise que je suis sur un serveur hebergé dédié sous Linux (avec safe_mode à off).

Quelqu'un a t-il une idée pour résoudre ce problème ? Il faudrai faire en sorte que mon script ne s'arrête pas avant que la fonction exec() ai terminé l'exécution du .jar...

Merci
Hello BenTheBest

J'ai le même problème avec un plugin Wordpress (Postie pour ne pas le citer) et je n'ai pas trouvé la solution Smiley decu

Donc si quelqu'un a une solution, vous ferez 2 heureux Smiley smile
Tu veux dire que php kill le processus ? Il le fait après combien de temps ?

Si l'exécution met autant de temps que ça, pourquoi ne pas le lancer en tâche de fond, afficher un message de chargement, et vérifier périodiquement si le processus a terminé ?
Il doit y avoir moyen de lancer ce processus en asynchrone et récupérer son PID, et ensuite vérifier avec ps si le PID y est toujours toutes les quelques secondes. Le contrôle reste du côté du script php, donc avec une limite de temps infinie, ça ne devrait pas sauter.
Salut,

Je pense que le problème viens du .jar, qui ne renvoie pas un état quand il a finit son processus, du coup la fonction exec() s'arrête au bout d'un certain temps.

Essaie de faire que exec() qui lance un script .sh qui prend du temps (genre une immense boucle avec un sleep), met ton set_time_limt(0) et regarde si ton script php s'arrête ou pas.
Merci pour vos réponses

Bon alors j'en sais un peu plus...

En fait après avoir fait quelques tests, je me suis rendu compte que cela ne venait pas du limit_time mais de ma ligne de commande que je passe dans exec...

En fait, je ne l'ai pas précisé mais lorsque je lance mon exécutable, il y a un argument qui varie en taille (il peut être une chaine très très longue) et apparemment lorsqu'elle est trop longue ça ne marche pas!

j'ai lu quelque part que les arguments passés en ligne de cmde sont limités en taille...

C'est pour que des fois ça marchait et des fois pas!

Donc si vous avez une solution pour contourner le fait que cette chaine soit trop longue (sans passer par un fichier de préférence) et bien je suis preneur!

Merci Smiley smile
La taille limite d'une ligne de commande est probablement assez grande du côté du système. Ca doit venir uniquement de php, auquel cas la seule solution sera de passer par l'écriture d'un script bash temporaire...
Fais peut-être aussi attention aux caractères spéciaux du genre guillemets, dollars, etc. interprétés par la ligne de commande. Utilisés de manière incorrecte, il pourraient tout faire foirer. Je pense que c'est plutôt ça le problème en fait.
Par exemple, double-échapper le caractère $, une fois pour php et une fois pour bash, sinon l'un ou l'autre l'interpétera comme une variable.
On m'a conseillé d'utilisé un "tube nommé" mais étant donné que je n'y connais pas grand chose en linux, si quelqu'un pourrai m'aider ce serai cool Smiley lol