美好的一天。我想知道我是否可以在API响应中使用分块传输编码(进一步的CTE)?我的数据库中有大量数据,我需要在一个请求中将其传输到客户端。我已经阅读了很多有关CTE机制的信息,但不幸的是,我找不到如何实现此功能的方法。
要提到的一件事:没有分页。它应该是一个自治系统,它将数据返回到客户端的端点,而不是返回到网页。
正如我提到的,数据存储在数据库中。唯一的问题是如何将数据分成多个段(块)并在一个API响应中(一对一)发送。
谢谢。
答案 0 :(得分:0)
我认为您可能对查询生成器上的块方法感兴趣。
分组结果
如果您需要处理数千个数据库记录,请考虑使用 块方法。此方法检索一小部分结果 一次将每个块馈送到Closure中进行处理。这个 该方法对于编写处理的Artisan命令非常有用 数千条记录。例如,让我们与整个用户一起工作 表,一次包含100条记录:
$response = new \Symfony\Component\HttpFoundation\StreamedResponse(function() {
$handle = fopen('php://output', 'w');
DB::table('users')->orderBy('id')->chunk(100, function ($users) use($handle) {
foreach ($users as $user) {
fputs($handle, json_encode($user));
}
});
fclose($handle);
});
return $response;
进一步阅读:https://laravel.com/docs/master/queries#chunking-results
据我所知,如果您返回JSON响应,Laravel does this by default。
我的解决方案不必要地复杂且复杂。由于确实不需要{@ {1}},因此我将其删除了。请参阅下面的更新示例。
StreamedResponse
答案 1 :(得分:0)
在我的特定情况下,我已经通过使用以下代码(示例)解决了我的问题:
use Symfony\Component\HttpFoundation\StreamedResponse;
$response = new StreamedResponse();
$response->setCallback(function () {
var_dump('Hello World');
flush();
sleep(2);
var_dump('Hello World');
flush();
});
$response->send();