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);
25
demandé sur Community 2011-03-20 10:25:46

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);
24
répondu Emmanuel 2011-03-20 09:41:38

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.

9
répondu Rohit 2017-05-23 12:34:59

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

4
répondu JohnP 2017-05-23 11:33:26

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.

3
répondu Shamim Hafiz 2011-03-20 07:32:19

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.

1
répondu John 2017-05-30 03:06:18

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"));
0
répondu William N Irwin 2017-08-16 19:28:40