在proc_open()

时间:2017-07-11 10:22:43

标签: php jquery html linux redis

我有2个PHP脚本caller.phptask.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功能等。

1 个答案:

答案 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/

希望它有所帮助。