如何在Laravel中使用分块传输编码?

时间:2019-02-12 01:41:15

标签: php laravel rest http http-1.1

美好的一天。我想知道我是否可以在API响应中使用分块传输编码(进一步的CTE)?我的数据库中有大量数据,我需要在一个请求中将其传输到客户端。我已经阅读了很多有关CTE机制的信息,但不幸的是,我找不到如何实现此功能的方法。

要提到的一件事:没有分页。它应该是一个自治系统,它将数据返回到客户端的端点,而不是返回到网页。

正如我提到的,数据存储在数据库中。唯一的问题是如何将数据分成多个段(块)并在一个API响应中(一对一)发送。

谢谢。

2 个答案:

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