204 votes

Asynchrone shell exec de PHP

J'ai un script PHP qui doit invoquer un script shell, mais n'a pas de soins à la sortie. Le script shell fait un certain nombre d'appels SOAP et il est lent, donc je ne veux pas ralentir le PHP demande pendant qu'il attend une réponse. En effet, le PHP demande doit être en mesure de sortir sans arrêter le processus du shell.

J'ai regardé dans les différents exec(), shell_exec(), pcntl_fork(), etc. fonctions, mais aucun d'entre eux semblent offrir exactement ce que je veux. (Ou, s'ils le font, ce n'est pas clair pour moi comment.) Toutes les suggestions?

227voto

warren Points 12172

Si elle "ne se soucie pas de la sortie", ne pouvait pas le exec pour le script est appelé avec l' & à l'arrière-plan du processus?

EDIT - en intégrant ce @AdamTheHut commenté ce post, vous pouvez l'ajouter à un appel à l' exec:

" > /dev/null 2>/dev/null &"

Qui va rediriger les deux stdio (premier >) et stderr (2>) /dev/null et exécuter en arrière-plan.

Il y a d'autres façons de faire la même chose, mais c'est le plus simple à lire.


Une alternative à la double ci-dessus-redirect:

" &> /dev/null &"

53voto

Czimi Points 1145

J'ai utilisé à pour cela, car c'est vraiment de départ d'un processus indépendant.

<?php
    `echo "the command"|at now`;
?>

22voto

Darryl Hein Points 33819

Sur linux, vous pouvez effectuer les opérations suivantes:

$cmd = 'nohup nice -n 10 /usr/bin/php -c /path/to/php.ini -f /path/to/php/file.php action=generate var1_id=23 var2_id=35 gen_id=535 > /path/to/log/file.log & printf "%u" $!';
$pid = shell_exec($cmd);

Cela exécutera la commande à la commande prompty et puis il suffit de retourner le PID, que vous pouvez vérifier pour > 0 pour s'assurer qu'il a travaillé.

Cette question est similaire: N'PHP ont threading?

13voto

Mark Biek Points 41769

php-executer-un-fond-processus a quelques bonnes suggestions. Je pense que le mien est assez bonne, mais je suis partial :)

6voto

Leo Points 1587

Sous Linux, vous pouvez démarrer un processus dans un nouveau thread indépendant en ajoutant une esperluette à la fin de la commande

mycommand -someparam somevalue &

Dans Windows, vous pouvez utiliser le bouton "démarrer" de commande DOS

start mycommand -someparam somevalue

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X