Reputation: 5395
I'm trying to setup a php trigger file that will set off a background process. (see this question)
I'm doing this on a Windows Wampserver environment.
So for example I have trigger.php
that runs the exec function that calls for my backgroundProcess.php
to be parsed and executed.
However the problem is that my trigger.php
file is waiting for the exec()
command to finish running backgroundProcess.php
before it stops. The background process runs for about 20-30 seconds, and trigger.php
is waiting all that time until backgroundProcess.php
has fully finished.
Is that making sense? Here is the trigger.php
file that runs the exec()
command
exec('C:\wamp\bin\php\php'.phpversion().'\php.exe -f C:\path\to\backgroundProcess.php > C:\wamp\bin\php\php'.phpversion().'\dev\null &');
Basically, I'm wanting trigger.php
to just trigger off the backgroundProcess and not wait around for it to finish.
Upvotes: 26
Views: 31660
Reputation:
In addition to Rohit's answer above, I edited his solution to work on Windows 10 PHP 7.0.3:
pclose(popen("start /B ". $cmd, "w"));
Upvotes: 2
Reputation: 81
It may well be that when using the exec()
in a windows environment that redirection is to NUL:
. /dev/null
is a *nix null file.
Upvotes: 1
Reputation: 449
Tried to achieve the same on a Windows 2000 server with PHP 5.2.8.
None of the solutions worked for me. PHP kept waiting for the response.
Found the solution to be :
$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 : Posting the same reply to the other thread (PHP on a windows machine; Start process in background) since these 2 links helped me a lot in doing some research on this.
Upvotes: 10
Reputation: 5395
Problem solved with the following command:
$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);
Upvotes: 26
Reputation: 50009
From the manual : http://www.php.net/manual/en/function.exec.php
Note:
If a program is started with this function, in order for it to continue running in the background, the output of the program must be redirected to a file or another output stream. Failing to do so will cause PHP to hang until the execution of the program ends.
And a similar question I answered : Call another PHP script and return control to user before the other script completes
Upvotes: 4
Reputation: 22064
You may need to change your implementation approach. Having to wait for such a long time would be an annoyance for the user of your app and fatal for the entire app.
For such tasks, it's usually better to queue the task, ideally on database, and process them periodically. There are chron jobs on Linux based systems. In Windows, you can use a scheduler to launch the backgroundProcess.php.
Upvotes: 3