收到AJAX请求后,我想在PHP脚本完成之前向用户提供反馈,因为这需要很长时间。
我认为yii\web\Response
对象的send()
方法是为此做的,所以我在控制器操作中尝试了以下内容:
Yii::$app->response->format = Response::FORMAT_JSON;
Yii::$app->response->data = [ 'success' => $someData ];
Yii::$app->response->send();
// code that takes long
sleep(5);
发送响应,但睡眠5秒后。
同样的运气:
ob_start();
echo json_encode([ 'success' => $someData ]);
header('Connection: close');
header('Content-Type: application/json');
header('Content-Length: '.ob_get_length());
ob_end_flush();
flush();
// code that takes long
sleep(5);
我对控制器操作中的最后一个代码没有任何信心,但我在第一个代码中有这个...我错过了什么?
编辑:我使用的是nginx + PHP_FPM
答案 0 :(得分:0)
我认为您搜索的是长轮询
这是PHP + jQuery上长轮询实现的精彩工作示例
https://github.com/panique/php-long-polling
以下是相关主题,深入解释该领域的不同技术(包括长轮询) - What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?
此外,您还可以查看此视频教程
答案 1 :(得分:0)
PHP_FPM可用fastcgi-finish-request()
:
此函数将所有响应数据刷新到客户端并完成 请求。这允许在没有执行的情况下执行耗时的任务 将连接保持打开状态。
Yii::$app->response->format = Response::FORMAT_JSON;
Yii::$app->response->data = [ 'success' => $someData ];
Yii::$app->response->send();
fastcgi-finish-request();
// code that takes long
sleep(5);