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);
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);
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.
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
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.
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.
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"));