在收到AJAX请求后,我希望在PHP脚本完成之前向用户提供反馈,因为这需要很长时间。
我认为send()对象的yii\web\Response方法是为此创建的,因此我在控制器操作中尝试了以下操作:
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
发布于 2016-07-14 02:04:38
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);发布于 2016-07-12 08:16:32
我认为您要搜索的是长轮询
下面是PHP+jQuery上长轮询实现的好示例
https://github.com/panique/php-long-polling
下面是相关的主题,并对该领域的不同技术(包括长轮询)进行了深入的说明- What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?
此外,您还可以查看本视频教程。
https://stackoverflow.com/questions/38308068
复制相似问题