StreamedResponse如何运作?

时间:2015-09-30 13:01:55

标签: php symfony callback

我在控制器动作中写下面的代码。

$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函数在这里是如何工作的。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

问题是关于StreamResponse的问题,而是关于你试图将700MB文件读取到内存中的事实(在通过小部件返回之前)。

根据您阅读的文件,您应该通过块读取它:

  • 如果这是一个文本文件,请逐行阅读,例如
  • 如果这是一个二进制文件,您可以使用相同的功能,但使用$maxlen$offset来限制您每次阅读的内容。

你必须这样做是一个循环,它将用你读过的内容更新StreamResponse