web-dev-qa-db-fra.com

PHP exec () en tant que processus en arrière-plan (environnement Windows Wampserver)

J'essaye d'installer un fichier de déclencheur de php qui déclenchera un processus d'arrière-plan. (voir cette question )

Je le fais sur un environnement Windows Wampserver.

Ainsi, par exemple, j'ai trigger.php qui exécute la fonction exec qui appelle mon backgroundProcess.php à être analysé et exécuté.

Cependant, le problème est que mon fichier trigger.php attend que la commande exec() finisse d'exécuter backgroundProcess.php avant de s'arrêter. Le processus d'arrière-plan s'exécute pendant environ 20-30 secondes et trigger.php attend tout ce temps jusqu'à ce que backgroundProcess.php soit complètement terminé.

Est-ce que cela a du sens? Voici le fichier trigger.php qui exécute la commande exec()

exec('C:\wamp\bin\php\php'.phpversion().'\php.exe -f C:\path\to\backgroundProcess.php > C:\wamp\bin\php\php'.phpversion().'\dev\null &');

Fondamentalement, je veux que trigger.php déclenche simplement le processus backgroundProcess et n'attende pas qu'il soit terminé.


EDIT

Problème résolu avec la commande suivante:

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false);
25
Emmanuel

Problème résolu avec la commande suivante:

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false);
24
Emmanuel

J'ai essayé d'obtenir le même résultat sur un serveur Windows 2000 avec PHP 5.2.8.

Aucune des solutions n'a fonctionné pour moi. PHP continuait d'attendre la réponse.

Trouvé la solution pour être:

$cmd = "E:\PHP_folder_path\php.exe E:\some_folder_path\backgroundProcess.php";
pclose(popen("start /B ". $cmd, "a"));  // mode = "a" since I had some logs to edit

ps: Publier la même réponse sur l’autre fil ( PHP sur une machine Windows; processus de démarrage en arrière-plan ), car ces 2 liens m’ont beaucoup aidé à faire des recherches sur ce.

9
Rohit

Extrait du manuel: http://www.php.net/manual/en/function.exec.php

Remarque:

Si un programme est démarré avec cette fonction , Pour que le programme continue de fonctionner en arrière-plan, la sortie du programme doit être redirigée vers un . fichier ou un autre flux de sortie. Si Ne le fait pas, PHP sera suspendu jusqu'à ce que L'exécution du programme soit terminée.

Et une question similaire à laquelle j'ai répondu: Appeler un autre script PHP et rendre le contrôle à l'utilisateur avant la fin de l'autre script

4
JohnP

Vous devrez peut-être modifier votre approche de mise en œuvre. Avoir à attendre aussi longtemps serait une gêne pour l'utilisateur de votre application et fatal pour l'ensemble de l'application.

Pour ces tâches, il est généralement préférable de la mettre en file d'attente, idéalement sur une base de données, et de la traiter périodiquement. Il existe des travaux chronologiques sur des systèmes Linux. Sous Windows, vous pouvez utiliser un planificateur pour lancer le fichier backgroundProcess.php.

3
Shamim Hafiz

Il se peut que lors de l’utilisation de exec() dans un environnement Windows, la redirection se fasse vers NUL:. /dev/null est un fichier null * nix.

1
John

En plus de la réponse de Rohit ci-dessus, j'ai modifié sa solution pour qu'elle fonctionne sous Windows 10 PHP 7.0.3:

pclose(popen("start /B ". $cmd, "w"));
0
William N Irwin