J'ai une tâche intensive de processus que je voudrais exécuter en arrière-plan.
L'utilisateur clique sur une page, le script PHP s'exécute, et enfin, en fonction de certaines conditions, si nécessaire, il doit exécuter un script shell, EG:
shell_exec('php measurePerformance.php 47 844 [email protected]');
Actuellement, j'utilise shell_exec , mais cela nécessite que le script attende une sortie. Existe-t-il un moyen d'exécuter la commande que je souhaite sans attendre qu'elle se termine?
Réponses:
Que diriez-vous d'ajouter.
Notez que cela supprime également stdio et stderr.
la source
> /dev/null 2>&1 &
comme on le voit dans d'autres réponses est une forme laconique de> /dev/null 2>/dev/null &
donnée ici. Cela signifie essentiellement "rediriger STDERR (2) au même endroit que STDOUT (& 1)".Cela exécutera une commande et se déconnectera du processus en cours. Bien sûr, cela peut être n'importe quelle commande que vous souhaitez. Mais pour un test, vous pouvez créer un fichier php avec une commande sleep (20) it.
la source
nohup
et le&
?Vous pouvez également rendre votre sortie au client instantanément et continuer à traiter votre code PHP par la suite.
C'est la méthode que j'utilise pour les appels Ajax qui attendent depuis longtemps et qui n'auraient aucun effet côté client:
Vous pouvez trouver l'explication détaillée ici: http://oytun.co/response-now-process-later
la source
Sous Windows 2003, pour appeler un autre script sans attendre, j'ai utilisé ceci:
Cela ne fonctionne qu'APRÈS avoir donné des autorisations modifiées sur
cmd.exe
- ajoutez Lecture et Exécution pourIUSR_YOURMACHINE
(j'ai également défini l'écriture sur Refuser).la source
Bien sûr, car
windows
vous pouvez utiliser:Remarque:
Si vous obtenez une
COM
erreur, ajoutez l'extension à votrephp.ini
et redémarrezapache
:la source
Utilisez la
popen
commande PHP , par exemple:Cela créera un processus enfant et le script s'exécutera en arrière-plan sans attendre la sortie.
la source
Si c'est en dehors d'une page Web, je recommande de générer un signal quelconque (déposer un fichier dans un répertoire, peut-être) et d'avoir un travail cron ramasser le travail qui doit être fait. Sinon, nous allons probablement entrer dans le domaine de l'utilisation
pcntl_fork()
etexec()
de l'intérieur d'un processus Apache, et c'est juste un mauvais mojo.la source
Cela fonctionnera mais vous devrez faire attention à ne pas surcharger votre serveur car il créera un nouveau processus à chaque fois que vous appelez cette fonction qui s'exécutera en arrière-plan. Si un seul appel simultané en même temps, cette solution de contournement fera le travail.
Sinon, je vous conseillerais d'exécuter une file d'attente de messages comme par exemple beanstalkd / gearman / amazon sqs.
la source