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

Php 如何在Laravel中使用分块传输编码?,php,laravel,rest,http,http-1.1,Php,Laravel,Rest,Http,Http 1.1,你好。我想知道我是否可以在API响应中使用分块传输编码(进一步的CTE)?我的数据库中有大量数据,我需要在一个请求中将其传输到客户端。我读了很多关于CTE机制的书,但不幸的是,我找不到如何实现这一点 有一件重要的事情需要提及:没有分页。它应该是一个自治系统,将数据返回到客户端的端点,而不是网页 正如我提到的,数据存储在数据库中。唯一的问题是如何将数据分割成段(块)并在一个API响应中发送它们(一个接一个) 谢谢。我想您可能对查询生成器上的chunk方法感兴趣 分块结果 如果需要处理数千个数据库记

你好。我想知道我是否可以在API响应中使用分块传输编码(进一步的CTE)?我的数据库中有大量数据,我需要在一个请求中将其传输到客户端。我读了很多关于CTE机制的书,但不幸的是,我找不到如何实现这一点

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

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


谢谢。

我想您可能对查询生成器上的chunk方法感兴趣

分块结果

如果需要处理数千个数据库记录,请考虑使用 块方法。此方法检索一小部分结果 并将每个块送入闭包进行处理。这 方法对于编写处理该过程的Artisan命令非常有用 数千张唱片。例如,让我们与整个用户一起工作 以一次100条记录为单位的表:

进一步阅读:

分块传输编码 据我所知,如果您返回JSON响应,Laravel

更新: 我的解决方案不必要地错综复杂。我已经删除了
streamdresponse
,因为实际上不需要它。请参阅下面更新的示例

$json_response = collect();

DB::table('users')->orderBy('id')->chunk(100, function ($users) use($json_response) {
    foreach ($users as $user) {
        $json_response->push($user);
    }
});

return $json_response->toJson();

在我的具体案例中,我使用以下代码解决了我的问题(示例):

使用Symfony\Component\HttpFoundation\streamdresponse;
$response=新的流响应();
$response->setCallback(函数(){
var_dump(“你好世界”);
冲洗();
睡眠(2);
var_dump(“你好世界”);
冲洗();
});
$response->send();

关于第一段:你误解了我。我的意思是将数据分块发送,而不是获取。关于第二段:数据仍然像往常一样传输,而不是分块传输。所以我请你们帮我创建一个函数,将雄辩的模型转换成分块的结果。如果你们想发送数据,然后,我会亲自为用户设置一个端点,您可以在查询生成器上使用chunk方法-无论您是在雄辩的模型上设置,还是在控制器中设置,这都是您的选择-并且您将能够
chunk
将其降低到客户端可以管理的程度。我真的相信你想要的是我在回答中展示的方法。为了更好地理解你的困境,也许你可以告诉我——如果是这样的话——为什么你不能使用上述方法。我无法理解第一种方法的意义。循环虽然为了做什么?没有什么。。。该方法仅用于组块雄辩的模型,而不是API响应。CTE机制执行以下操作(如我所知):它将数据转换为字节码,但之前它将每个字符串转换为换行符、数据长度和实际数据的组合。听起来很复杂(维基百科解释得更好)。但是上面的方法只是对数据库记录进行分块。@Nod我添加了一个新的示例,希望对您有所帮助。您可能需要自定义标题来指示这是一个JSON响应,但除此之外,还可以:我不太明白分块传输编码与这个问题有什么关系。你所说的“将数据分割成段”是什么意思?简单地发送整个结果集会遇到什么问题?我们到底讨论了多少条记录?例如,它可能包含10条记录,但每个记录都有一个包含100k+条目的json字段。因此,将每个条目的数据流作为一个区块是完美的。
$json_response = collect();

DB::table('users')->orderBy('id')->chunk(100, function ($users) use($json_response) {
    foreach ($users as $user) {
        $json_response->push($user);
    }
});

return $json_response->toJson();