|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre éprouvé
![]() Benoît Inscription : janvier 2009 Messages : 392 ![]() |
Bonjour,
je bosse sur une application chargée de gérer des fichiers sur un serveur. Pour cela, l'application en PHP propose une interface utilisateur qui lance des scripts shells sur le serveur avec la commande system : Ces opérations peuvent durer longtemps et provoquent un timeout (la page arrête de charger) et les instructions suivantes ne sont pas traitées. Comment est ce que je peux faire pour palier ce problème ? merci d'avance. ben
__________________
Meet the free software gang |
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() Ingénieur développement logiciels Inscription : février 2008 Messages : 430 ![]() |
Modifie la valeur max_execution_time définie dans le php.ini.
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre. Linus Torvalds |
|
|
00
|
|
|
#3 |
|
Membre éprouvé
![]() Benoît Inscription : janvier 2009 Messages : 392 ![]() |
Je suis pas root et je voulais éviter de toucher aux valeur de la conf ?
Est ce la seule solution ? J'ai également essayé : mais sans effet. merci
__________________
Meet the free software gang |
|
|
00
|
|
|
#4 |
|
Membre régulier
![]() Guillaume M. Inscription : décembre 2010 Messages : 59 ![]() |
Si l’exécution du script ne retourne rien de particulier il est aussi possible de lancer la commande en arrière plan (avec "nohup"). Dans l'idéal on crée un fichier vide au lancement de la commande, et on le détruit à la fin de l’exécution, comme ça le script php peut savoir où il en est.
|
|
00
|
|
|
#5 | |
|
Membre chevronné
![]() Ingénieur développement logiciels Inscription : février 2008 Messages : 430 ![]() |
Lu dans la doc PHP.
Citation:
Il faudra peut-être revoir la manière dont tu lances ta commande pour ne pas attendre la fin de celle-ci pour finir le traitement php. Après en Ajax tu pourrais récupérer le statut et éventuellement la sortie voire les logs de ta commande.
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre. Linus Torvalds |
|
|
|
00
|
|
|
#6 |
|
Membre éprouvé
![]() Benoît Inscription : janvier 2009 Messages : 392 ![]() |
oui le serveur tourne en mode safe, donc effectivement set_time_limit ne sert à rien et en plus ça n'aurait pas fonctionné car j'utilise un appel externe avec system().
Actuellement, le script shell, qui est executé via system(), produit un fichier de log, en fonction des valeurs contenues dans ce fichier de log, l'appli va effectuer des opérations en bas de données. J'aurais besoin d'attendre la fin de l’exécution du script.
__________________
Meet the free software gang |
|
|
00
|
|
|
#7 | |
|
Membre chevronné
![]() Ingénieur développement logiciels Inscription : février 2008 Messages : 430 ![]() |
Citation:
Là tu es bloqué si tu ne veux pas modifier le php.ini, tu ne peux pas augmenter le timeout des scripts php. Il ne te reste plus qu'à faire comme je te l'ai expliqué dans mon post précédent.
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre. Linus Torvalds |
|
|
|
00
|
|
|
#8 | |
|
Membre éprouvé
![]() Benoît Inscription : janvier 2009 Messages : 392 ![]() |
Citation:
__________________
Meet the free software gang |
|
|
|
00
|
|
|
#9 |
|
Membre chevronné
![]() olivier ThiébautChef de projet/Architecte Inscription : mai 2004 Messages : 626 ![]() |
Bonjour,
D'accord avec le dernier post Ajax est la solution. Je l'utilise abondamment sur le lancement de procédures stockés en base. Le process se détache. Pour le contrôle, après fichier de log ou table Olivier
__________________
Architecte déstructurant, be cool, be free J2EE - PHP - Free OS |
|
|
00
|
|
|
#10 |
|
Membre éprouvé
![]() Benoît Inscription : janvier 2009 Messages : 392 ![]() |
ok super merci pour vos réponses, le hic est que je ne connais vraiment pas bien ajax ... mais je ne vois pas d'autres solutions...
Si vous avez des conseils ou des exemples, je suis preneur... merci d'avance, ben
__________________
Meet the free software gang |
|
|
00
|
|
|
#11 |
|
Membre chevronné
![]() olivier ThiébautChef de projet/Architecte Inscription : mai 2004 Messages : 626 ![]() |
Bonjour,
Regarde du côté de prototype ou Jquery simple efficace, pas la peine de réinventer la roue. Olivier
__________________
Architecte déstructurant, be cool, be free J2EE - PHP - Free OS |
|
|
00
|
|
|
#12 |
|
Membre éprouvé
![]() Benoît Inscription : janvier 2009 Messages : 392 ![]() |
ok, je regarde du coté AJAX et JQUERY pour lancer mon script de façon asynchrone. Est ce que tu peux m'orienter vers une méthode pour executer mon script de façon asynchrone ? Je suis en train de chercher mais je ne suis vraiment pas familier avec ces technos ...
merci d'avance, ben
__________________
Meet the free software gang |
|
|
00
|
|
|
#13 | ||||||
|
Membre chevronné
![]() olivier ThiébautChef de projet/Architecte Inscription : mai 2004 Messages : 626 ![]() |
Bonjour,
Tu peux détacher un process de son père, cela dépend de ta plateforme. Comme tu es sur une plateforme digne, unix ou linux il suffit d'utiliser, un script de cette forme Code :
Après tu peux améliorer, car dans mon cas je redirige la sortie standard vers rien 0 : STDIN 1: STDOUT 2: STDERR ces notions sont des notions bash. ce qui fait que tu peux faire un log des erreurs Code :
Il suffit que tu appelles la commande Code :
__________________
Architecte déstructurant, be cool, be free J2EE - PHP - Free OS |
||||||
|
|
00
|
|
|
#14 |
|
Membre régulier
![]() Guillaume M. Inscription : décembre 2010 Messages : 59 ![]() |
Attention cependant avec le "&" en bash, la commande s’exécute bien en arrière plan mais n'est pas détachée. Par exemple si la console est fermée avant la fin de l’exécution alors elle sera interrompu. Il est possible que le problème se pose à la fin de l’exécution du script PHP ?
Le préfixe "nohup" permet lui de détacher réellement le process. |
|
00
|
|
|
#15 |
|
Membre chevronné
![]() olivier ThiébautChef de projet/Architecte Inscription : mai 2004 Messages : 626 ![]() |
Bonjour,
Effectivement, oublié le détail, nohup est le meilleur Olivier
__________________
Architecte déstructurant, be cool, be free J2EE - PHP - Free OS |
|
|
00
|
|
|
#16 | ||||
|
Membre éprouvé
![]() Benoît Inscription : janvier 2009 Messages : 392 ![]() |
merci pour vos réponses,
nohup permet bien, en shell, de détacher un process du terminal ... mais dans cas ça ne résout pas mon problème : à savoir que l'instruction doit être traitée avant de pouvoir continuer à traiter les autres instructions PHP. Dans mon cas, soit le fichier script.sh : Code :
et le fichier index.php : Code :
Je dois attendre 1000 secondes avant de pouvoir afficher la page et c'est là que je rencontre le timeout. Dans mon cas, le script ne fait pas un "sleep 1000" mais un traitement qui peut effectivement durer très longtemps. J'ai pu voir un problème similaire ici Any idea ? merci d'avance, ben
__________________
Meet the free software gang |
||||
|
|
00
|
|
|
#17 |
|
Membre chevronné
![]() olivier ThiébautChef de projet/Architecte Inscription : mai 2004 Messages : 626 ![]() |
Bonjour,
En fait je crois avoir trouvé la piste de la solution int pcntl_fork ( void ) Voir la documentation PHP http://php.net/manual/fr/function.pcntl-fork.php Il faut comprendre par contre, la notion de processus père et fils, ainsi que la notion de contexte d'un programme. Olivier
__________________
Architecte déstructurant, be cool, be free J2EE - PHP - Free OS |
|
|
00
|
|
|
#18 | ||||
|
Membre régulier
![]() Guillaume M. Inscription : décembre 2010 Messages : 59 ![]() |
Dans le script bash :
Code :
Code :
|
||||
|
00
|
Copyright © 2000-2012 - www.developpez.com