【问题标题】:How does StreamedResponse work?StreamedResponse 如何工作?
【发布时间】:2015-09-30 13:01:54
【问题描述】:

我在控制器操作中编写了以下代码。

$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 函数在这里是如何工作的。谁能解释一下?

【问题讨论】:

    标签: php symfony callback


    【解决方案1】:

    问题显然与StreamResponse 无关,而在于您尝试将 700MB 文件一次读取到内存中(在小部分返回之前)。

    根据你阅读的文件,你应该分块阅读:

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-15
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      相关资源
      最近更新 更多