2010-11-18 5 views
1

J'ai un site web PHP et je voudrais exécuter un très long script Python en arrière-plan (300 Mo de mémoire et 100 secondes). La communication du processus se fait via la base de données: lorsque le script Python termine son travail, il met à jour un champ dans la base de données, puis le site affiche des graphiques, basés sur les résultats du script Python.PHP et shell_exec

Je peux exécuter "manuellement" le script Python de bash (n'importe quel répertoire courant) et cela fonctionne. Je voudrais intégrer dans PHP et j'ai essayé la fonction shell_exec:

shell_exec("python /full/path/to/my/script") mais il ne fonctionne pas (je ne vois pas de sortie)

Avez-vous des idées ou des suggestions? Cela vaut la peine de mentionner que le script python est un wrapper sur d'autres outils polyglot (Java mélangé avec C++).

Merci!

+0

Veuillez inclure plus de détails comme le script doit être exécuté en tant que processus web, ou via l'interface de ligne de commande - en bref, 100seconds et le 300Mb dépassera probablement le temps d'exécution de la page autorisé - http://stackoverflow.com/ questions/45953/php-execute-a-background-processus – ajreal

+0

- il a dit qu'il utilise shell_exec - donc je suppose qu'il utilise son script comme un outil de ligne de commande – Thariama

+0

le script est un outil de ligne de commande –

Répondre

0

Merci pour vos réponses, mais aucun d'entre eux a travaillé :(j'ai décidé de mettre en œuvre de manière sale, en utilisant l'attente occupée, au lieu de déclencher un événement lorsqu'un enregistrement est inséré

J'ai écrit un processus de sauvegarde ss qui s'exécute pour toujours et à chaque itération vérifie s'il y a quelque chose de nouveau dans la base de données. Quand il trouve un enregistrement, il exécute le script et tout va bien. L'idée est que je lance le processus de sauvegarde à partir du shell.

0

Un script peut être que votre script prend plus de temps que le temps d'attente du serveur défini pour une requête (peut être défini dans php.ini ou httpd.conf).

Un autre problème pourrait être que le compte des serveurs n'a pas le droit d'exécuter ou d'accéder au code ou aux fichiers nécessaires à l'exécution de votre script.

+0

Vous avez raison sur le premier problème, mais comment puis-je lancer un travail d'arrière-plan à partir de PHP? (aussi, comment puis-je déboguer le problème que cela fonctionne à partir de la ligne de commande et pas à partir de exec_shell) –

+0

Eh bien, vous avez un script - lors de l'exécution de ce script de PHP via exec, vous devez obtenir des informations de débogage. Pourquoi ne mettez-vous pas simplement quelques instructions de débogage dans votre script (écrivez à STDERR ou un fichier?) – Thariama

+0

le problème est que l'information de débogage est vague; J'exécute des programmes de "boîte noire" et ils ne rapportent pas trop. J'ai changé l'implémentation et tout va bien maintenant (vérifiez ma réponse). –

1

Tout d'abord set_time_limit(0); va faire fonctionner votre script pour toujours, donc le délai d'attente ne devrait pas être un problème. Deuxième appel any * exec en PHP n'utilise PAS le PATH par défaut (peut dépendre de la configuration), donc votre script va quitter sans donner d'informations sur le problème, et il finit souvent par être qu'il ne peut pas trouver le programme, dans ce cas python. Donc changer à:

shell_exec("/full/path/to/python /full/path/to/my/script"); 

Si votre script python est en cours d'exécution sur ses propres sans problèmes, alors il est très probable que ce soit le problème. En ce qui concerne la mémoire, je suis sûr que PHP n'utilisera pas la même mémoire que python utilise. Donc, si vous utilisez 300 Mo PHP devrait rester à la valeur par défaut (disons 1 Mo) et attendez la fin de shell_exec.

0

à cet avant et m'a aidé à résoudre mon problème d'exécution de fond:

function background_exec($command) 
{ 
    if(substr(php_uname(), 0, 7) == 'Windows') 
    { 
     pclose(popen('start "background_exec" ' . $command, 'r')); 
    } 
    else 
    { 
     exec($command . ' > /dev/null &'); 
    } 
} 

Source:.

http://www.warpturn.com/execute-a-background-process-on-windows-and-linux-with-php/

+0

aww sry mal lu le sujet mais peut-être il aide si votre script court à long –

3

shell_exec retourne une chaîne, si vous l'exécutez seul, il ne produira pas de sortie, de sorte que vous pouvez écrire:

$output = shell_exec(...); 
print $output; 
0

Je trouve que la question quand j'ai essayé ce fut le simple fait que je l'ai fait ne pas compiler la source sur le serveur sur lequel je l'ai exécuté. En compilant sur votre ordinateur local, puis en le téléchargeant sur votre serveur, il sera corrompu d'une manière ou d'une autre. shell_exec() devrait fonctionner en compilant la source que vous essayez d'exécuter sur le même serveur que votre script.

Questions connexes