我有2个PHP脚本caller.php
和task.php
。使用JQuery Ajax请求调用caller.php
,然后caller.php
启动一个在后台运行PHP文件的进程,如下面的代码
JQuery Ajax请求
var xhr = $.ajax({
url: "https://www.example.com/caller.php",
type: "post",
data: ""
}).done(function(){}
});
Caller.php
$cmd = 'php task.php &'; // To call task.php in background
$descriptorspec = array(
0 => array('pipe', 'r'), // STDIN
1 => array('pipe', 'w'), // STDOUT
2 => array('pipe', 'w') // STDERR
);
$pipes = array();
$process = proc_open($cmd, $descriptorspec, $pipes);
do {
// get the pid of the child process and it's exit code
$status = proc_get_status($process);
} while($status['running'] !== FALSE);
$pid = $status['pid'];
$exitcode = $status['exitcode'];
proc_close($process);
if($exitcode == 0){echo 'Task.php is running.';}
我从Running a php script via ajax, but only if it is not already running
学到了上面的代码以上代码工作正常但proc_open()
等待task.php
未完成其工作。我希望task.php
在后台运行,并立即从caller.php
得到回应。
我还尝试了exec()
和shell_exec()
,但没有使用它们。他们等task.php
完成整个工作然后回复。
我还在ajax中尝试xhr.abort()
只留下ajax响应,但后来我发现xhr.abort()
没有关闭与服务器的连接。
请注意我已修剪代码并删除了一些基本会话和用户登录等步骤,以缩短代码。
P.S。我有一个VPS所以,我有足够的权限启用/禁用PHP功能等。
答案 0 :(得分:0)
好吧我认为你错过了flush()语句将状态返回给ajax,例如:
do {
// get the pid of the child process and it's exit code
$status = proc_get_status($process);
echo $status['running'];
ob_flush();flush(); // Send output to browser immediately
} while($status['running'] !== FALSE);
请记住,如果你使用ob_flush()和flush(),你将得到的结果不在done函数中,但是在xhr.onprogress事件中这里是一个带有explication的例子https://www.sitepoint.com/php-streaming-output-buffering-explained/
希望它有所帮助。