PHP exec () en tant que Processus de fond (environnement Windows Wampserver)
j'essaie de configurer un fichier de déclenchement php qui déclenchera un processus de fond. (voir cette question )
je fais cela sur un environnement Windows Wampserver.
donc par exemple j'ai trigger.php
qui exécute la fonction exec qui demande que mon backgroundProcess.php
soit analysé et exécuté.
cependant le problème est que mon fichier trigger.php
attend la commande exec()
pour terminer la course backgroundProcess.php
avant qu'elle ne s'arrête. Le processus de background dure environ 20-30 secondes, et trigger.php
attend tout ce temps jusqu'à ce que backgroundProcess.php
soit complètement terminé.
est-ce logique? Voici le fichier trigger.php
qui exécute la commande exec()
1519150920"
exec('C:wampbinphpphp'.phpversion().'php.exe -f C:pathtobackgroundProcess.php > C:wampbinphpphp'.phpversion().'devnull &');
en gros, je veux que trigger.php
déclenche le processus de fond et n'attende pas qu'il se termine.
MODIFIER
Problème résolu avec la commande suivante:
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:wampbinphpphpVERSIONNUMBERphp-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false);
6 réponses
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);
a essayé d'obtenir la même chose sur un serveur Windows 2000 avec PHP 5.2.8.
Aucune des solutions n'a fonctionné pour moi. PHP continué à attendre pour la réponse.
a 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 : Poster la même réponse à l'autre fil ( PHP sur une machine windows; Démarrer le processus en arrière-plan ) car ces 2 liens m'ont beaucoup aidé à faire des recherches sur ce sujet.
du manuel: http://www.php.net/manual/en/function.exec.php
Note:
si un programme est lancé avec ceci fonction dans l'ordre pour continuer cours d'exécution en arrière-plan, la sortie le programme doit être redirigé vers une fichier ou d'un autre flux de sortie. Défaillant pour ce faire, PHP sera suspendu jusqu'à ce que l'exécution du programme se termine.
Et une question similaire, j'ai répondu: appeler un autre script PHP et retourner le contrôle à l'utilisateur avant que l'autre script complète
vous pourriez avoir besoin de changer votre approche de mise en œuvre. Avoir à attendre pendant tant de temps, serait une gêne pour l'utilisateur de votre application et fatale pour l'ensemble de l'application.
pour de telles tâches, il est généralement préférable de faire la queue, idéalement sur la base de données, et de les traiter périodiquement. Il y a des jobs chron sur des systèmes basés sur Linux. Dans Windows, vous pouvez utiliser un scheduler pour lancer le processus background.php.
il se peut bien que lors de l'utilisation du exec()
dans un environnement windows que la redirection est à NUL:
. /dev/null
est un fichier null *nix.
en plus de la réponse de Rohit ci-dessus, j'ai édité sa solution pour travailler sur Windows 10 PHP 7.0.3:
pclose(popen("start /B ". $cmd, "w"));