php exec command (or similar) to not wait for result

PhpExec

Php Problem Overview


I have a command I want to run, but I do not want PHP to sit and wait for the result.

<?php
echo "Starting Script";
exec('run_baby_run');
echo "Thanks, Script is running in background";
?>

Is it possible to have PHP not wait for the result.. i.e. just kick it off and move along to the next command.

I cant find anything, and not sure its even possible. The best I could find was someone making a CRON job to start in a minute.

Php Solutions


Solution 1 - Php

From the documentation:

> In order to execute a command and have it not hang your PHP script while
> it runs, the program you run must not output back to PHP. To do this,
> redirect both stdout and stderr to /dev/null, then background it.
> > > /dev/null 2>&1 & > > In order to execute a command and have
> it spawned off as another process that
> is not dependent on the Apache thread
> to keep running (will not die if
> somebody cancels the page) run this: > > exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');

Solution 2 - Php

You can run the command in the background by adding a & at the end of it as:

exec('run_baby_run &');

But doing this alone will hang your script because:

> If a program is started with exec 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.

So you can redirect the stdout of the command to a file, if you want to see it later or to /dev/null if you want to discard it as:

exec('run_baby_run > /dev/null &');

Solution 3 - Php

This uses wget to notify a URL of something without waiting.

$command = 'wget -qO- http://test.com/data=data';
exec('nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);

This uses ls to update a log without waiting.

$command = 'ls -la > content.log';
exec('nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);

Solution 4 - Php

I know this question has been answered but the answers i found here didn't work for my scenario ( or for Windows ).

I am using windows 10 laptop with PHP 7.2 in Xampp v3.2.4.

$command = 'php Cron.php send_email "'. $id .'"';
if ( substr(php_uname(), 0, 7) == "Windows" )
{
	//windows
	pclose(popen("start /B " . $command . " 1> temp/update_log 2>&1 &", "r"));
}
else
{
	//linux
	shell_exec( $command . " > /dev/null 2>&1 &" );
}

This worked perfectly for me.

I hope it will help someone with windows. Cheers.

Solution 5 - Php

There are two possible ways to implement it. The easiest way is direct result to dev/null

exec("run_baby_run > /dev/null 2>&1 &");

But in case you have any other operations to be performed you may consider ignore_user_abort In this case the script will be running even after you close connection.

Solution 6 - Php

>>"exec nohup setsid your_command"

the nohup allows your_command to continue even though the process that launched may terminate first. If it does, the the SIGNUP signal will be sent to your_command causing it to terminate (unless it catches that signal and ignores it).

Solution 7 - Php

On Windows, you may use the COM object:

if(class_exists('COM')) {
    $shell = new COM('WScript.Shell');
    $shell->Run($cmd, 1, false);
}
else {
    exec('nohup ' . $cmd . ' 2>&1 &');
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiongregView Question on Stackoverflow
Solution 1 - PhpCristianView Answer on Stackoverflow
Solution 2 - PhpcodaddictView Answer on Stackoverflow
Solution 3 - PhpPaul TView Answer on Stackoverflow
Solution 4 - PhpAnilView Answer on Stackoverflow
Solution 5 - PhpAleksandr RyabovView Answer on Stackoverflow
Solution 6 - PhpjobeardView Answer on Stackoverflow
Solution 7 - PhpBenjaminView Answer on Stackoverflow