PHP exec() as Background Process (Windows Wampserver Environment)

30,362

Solution 1

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

Solution 2

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.

Solution 3

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

Solution 4

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.

Solution 5

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"));
Share:
30,362

Related videos on Youtube

Emmanuel
Author by

Emmanuel

Media production, Design & Programming. Well-versed in PHP, Javascript, Angular 2+, SQL-server, mySQL, NoSql, Frontend-dev, Serverless, Lambda, Cloudflare Workers. Competent in Adobe Premier, Photoshop, Illustrator, InDesign and Audition. Enjoys designing for UI and desktop publishing. Exploring mobile app development with react native and flutter. A conscientious Christian.

Updated on July 09, 2022

Comments

  • Emmanuel
    Emmanuel almost 2 years

    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.

    • Muhammad Gelbana
      Muhammad Gelbana over 10 years
      This have been causing problems to me in a random manner. Throwing exceptions about not being able to run the command. Check my answer.
    • user3120717
      user3120717 over 10 years
      And what is in the file backgroundProcess.php?
  • Emmanuel
    Emmanuel about 13 years
    It's not something that can be queued. It's an ssh connection to a remote server and processing some things.
  • Emmanuel
    Emmanuel about 13 years
    @JohnP - Yes, but I thought I was doing that with the > C:\wamp\bin\php\php'.phpversion().'\dev\null & bit at the end?
  • JohnP
    JohnP about 13 years
    I think you need to create a file descriptor and pass it in as the second parameter. Not just pipe it.
  • Emmanuel
    Emmanuel about 13 years
    @JohnP - I haven't heard about a file descriptor before... At least not that term. Could you give a quick example?
  • JohnP
    JohnP about 13 years
    it's just a pointer to a file. $fd = fopen('dump.txt', 'a'). Just a fancy term for fd :)
  • Emmanuel
    Emmanuel about 13 years
    @JohnP - Nope, adding a file descriptor didn't do anything. But worked out something else, so Problem Solved!!! See above edit :)
  • JohnP
    JohnP about 13 years
    @Emmanuel, oh? hmm, maybe it's a windows thing. COM will only work on windows, I think. Also, I think you should post that as an answer and mark it as accepted if it worked for you. People with the same issue could use that :)
  • Muhammad Gelbana
    Muhammad Gelbana over 10 years
    This have been causing problems to me in a random manner. Throwing exceptions about not being able to run the command. Check my answer.
  • computrius
    computrius about 10 years
    @Muhammad Gelbana You dont have an answer in this question.. Care to be a bit more specific or link to the answer you are referring to?
  • Muhammad Gelbana
    Muhammad Gelbana about 10 years
    It was deleted ! Any way, here is a summary of what I wrote exec("CMD /C start yourcommand here"); I think the /C parameter switch isn't necessary, but I'm just being extra sure. Prefix your command with dirname(__FILE__) if you want to execute in the current directory of the script. This can only work if the start command exists on your windows machine.
  • JoshuaDavid
    JoshuaDavid over 9 years
    I found this method to be rock solid on Win7 running PHP 5.4
  • Milad Abooali
    Milad Abooali about 3 years
    a is not a valid mode for popen(), only r,w, or for binary,rb and rw accepted.