家人们chunkById 死循环
忽略把又复现不出来,估计是本地环境乱了
家人们我使用 chunkById 下载文件死循环了,但是换成chunk就好了,
我看chatgpt说我表里id不是连续的,我确实不是连续的,但是不应该死循环吧
求解答
$builder = new Order()
$date = date("y-m-d H-i-s");
$fileName = "xxx_{$date}.csv";
$response = new StreamedResponse(null, 200, [
'Content-Type' => 'text/csv',
'Content-Disposition' => 'attachment; filename='.$fileName,
]);
$response->setCallback(function () use ($builder){
$out = fopen('php://output', 'w');
fwrite($out, chr(0xEF) . chr(0xBB) . chr(0xBF)); // 添加 BOM
fputcsv($out,["xxx",]);
$res = $builde
->chunkById(1000,function ($data)use (&$out){
$data = json_decode(json_encode($data), true);
foreach ($data as $item) {
fputcsv($out,$item);
}
});
fclose($out);
});
return $response;
查出来的数据id不是有序的话确实会有问题 但是死循环不会吧 你的id不是数字? 看起来是个order表 一边写入 一边还有数据插入的逻辑?
$builder->orderByAsc(‘ID’)->chunkById(…);
调用前先排序
输出sql看看情况,这种一般就是获取到的最后一个ID有问题
建议把查询日志收集一下,从代码上看,除非你的 id 字段有1000条以上的重复数据,否则不应该死循环。
要换成 (clone $builder)->chunkById
没有复现
如果使用chunkById 首先确认表的主键是否是id如果不是则要在第二个参数指定主键字段