我在控制器动作中写下面的代码。
$response = new StreamedResponse();
$i = -999999;
$response->setCallback(function () {
while($i < 999999){
echo '{"G1ello":"hualala"}';
$i = $i + 1;
}
});
$filename = "Data.json";
$contentDisposition = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $filename);
$response->headers->set('Content-Type', 'application/json');
$response->headers->set('Content-Disposition', $contentDisposition);
return $response;
这样我就可以下载1.7 GB的JSON文件了 另一方面,我创建了一个700 MB的文件,并尝试使用代码
获取其内容file_get_contents($file)
错误被抛出。
允许的内存大小为XXX字节耗尽(尝试分配YYY 字节)
我不确定StreamedResponse和setCallback函数在这里是如何工作的。有人可以解释一下吗?
答案 0 :(得分:1)
问题是关于StreamResponse
的问题,而是关于你试图将700MB文件读取到内存中的事实(在通过小部件返回之前)。
根据您阅读的文件,您应该通过块读取它:
$maxlen
和$offset
来限制您每次阅读的内容。你必须这样做是一个循环,它将用你读过的内容更新StreamResponse
。