在Yii2中向用户发送AJAX响应后如何继续脚本?

时间:2016-07-11 13:20:15

标签: ajax yii2 response

收到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

2 个答案:

答案 0 :(得分:0)

我认为您搜索的是长轮询

这是PHP + jQuery上长轮询实现的精彩工作示例

https://github.com/panique/php-long-polling

以下是相关主题,深入解释该领域的不同技术(包括长轮询) - What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?

此外,您还可以查看此视频教程

https://www.screenr.com/SNH

答案 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);