web-dev-qa-db-fra.com

commande php exec (ou similaire) pour ne pas attendre le résultat

J'ai une commande que je veux exécuter, mais je ne veux pas que PHP reste assis et attende le résultat.

<?php
echo "Starting Script";
exec('run_baby_run');
echo "Thanks, Script is running in background";
?>

Est-il possible d’empêcher PHP d’attendre le résultat, c’est-à-dire de le lancer et de passer à la commande suivante.

Je ne trouve rien, et je ne suis pas sûr que ce soit possible. Le mieux que j'ai pu trouver, c’est que quelqu'un commence un travail CRON dans une minute.

58
greg

De la documentation :

Afin d'exécuter une commande, ne le faites pas bloquer votre script php pendant son exécution, le programme que vous exécutez ne doit pas restituer à php. Pour ce faire, redirigez stdout et stderr vers/dev/null, puis mettez-le en arrière-plan.

> /dev/null 2>&1 &

Afin d'exécuter une commande et de la générer comme un autre processus qui ne dépend pas du thread Apache pour continuer à fonctionner (ne mourra pas si quelqu'un annule la page), lancez ceci:

exec('bash -c "exec Nohup setsid your_command > /dev/null 2>&1 &"');

108
Cristian

Vous pouvez exécuter la commande en arrière-plan en ajoutant un & à la fin:

exec('run_baby_run &');

Mais faire cela seul accrochera votre script car:

Si un programme est démarré avec la fonction exec, il doit être redirigé vers un fichier ou un autre flux de sortie pour pouvoir continuer à fonctionner en arrière-plan. Faute de quoi, PHP sera bloqué jusqu'à la fin de l'exécution du programme.

Ainsi, vous pouvez rediriger la sortie standard de la commande vers un fichier, si vous souhaitez le voir plus tard ou vers /dev/null si vous souhaitez le supprimer comme:

exec('run_baby_run > /dev/null &');
44
codaddict

Cela utilise wget pour notifier une URL sans attendre.

$command = 'wget -qO- http://test.com/data=data';
exec('Nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);

Ceci utilise ls pour mettre à jour un journal sans attendre.

$command = 'ls -la > content.log';
exec('Nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);
7
Paul T

"exec Nohup setsid votre_commande"

le Nohup permet à votre_commande de continuer même si le processus lancé peut se terminer en premier Si tel est le cas, le signal SIGNUP sera envoyé à votre_commande, ce qui le mettra fin (sauf s’il capte ce signal et l’ignore).

0
jobeard

Il y a deux façons possibles de l'implémenter . Le plus simple est le résultat direct à dev/null

exec("run_baby_run > /dev/null 2>&1 &");

Mais si vous avez d'autres opérations à effectuer, vous pouvez envisager ignore_user_abort Dans ce cas, le script sera exécuté même après la fermeture de la connexion.

0
Aleksandr Ryabov