gpt4 book ai didi

PHP 在 proc_open() 之后没有立即返回

转载 作者:可可西里 更新时间:2023-11-01 11:26:16 31 4
gpt4 key购买 nike

我有 2 个 PHP 脚本,分别是 caller.phptask.phpcaller.php 使用 JQuery Ajax 请求调用,然后 caller.php 启动一个进程在后台运行 PHP 文件,如下面的代码

JQuery Ajax 请求

var xhr = $.ajax({
url: "https://www.example.com/caller.php",
type: "post",
data: ""
}).done(function(){}
});

调用者.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 完成它的全部工作然后响应。

我也试过 xhr.abort() 在 ajax 中只留下 ajax 响应,但后来我发现 xhr.abort() 没有关闭与服务器的连接.

请注意,我已经精简了代码并删除了一些基本 session 和用户登录等步骤,以使代码更短。

附言我有一个 VPS,所以我有足够的权限来启用/禁用 php 功能等。

最佳答案

好的,我认为您缺少将状态返回给 ajax 的 flush() 语句,例如:

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 事件中获得结果,这是一个带有解释的示例 https://www.sitepoint.com/php-streaming-output-buffering-explained/

希望对您有所帮助。

关于PHP 在 proc_open() 之后没有立即返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45031826/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com