【问题标题】:How to download (stream) large files in symfony2如何在 symfony2 中下载(流式传输)大文件
【发布时间】:2015-12-26 16:25:53
【问题描述】:

我想做什么:
用户点击了一个网址(例如:BASE-URL/download/json)。
代码从数据库中获取大量数据并将其流式传输到 JSON 文件中,并提示用户下载该文件。

我尝试了什么:
创建了一个大型 (700 MB) JSON 文件。 尝试用代码打开它,但抛出了错误。

file_get_contents($file)

错误:

已用完 XXX 字节的允许内存大小(尝试分配 YYY 字节)

我在 Symfony2 中工作。数据最大可达 700MB。无法增加分配的内存。 我怎样才能做到这一点?如果需要任何进一步的信息,请发表评论。

【问题讨论】:

  • 你尝试增加 php 内存限制ini_set('memory_limit', '512M') ??
  • 我没有将它用于大文件,所以 YMMV,但 Symfony 有 StreamedResponseBinaryFileResponse 对象。实际上不记得我用的是哪一个......无论如何看看。文档:symfony.com/doc/current/components/http_foundation/…
  • @egig 不能那样做。假设我没有这样做的访问权限/权限。
  • 您的第一个问题不是流式传输文件,而是读取文件。这就是 PHP 窒息的地方;您应该逐行读取文件并按照@Darragh 的建议流式传输响应,以避免内存耗尽问题
  • @tchap - 明白了。我将分块从数据库中获取数据。但是如何流式传输并提示用户将其作为连续文件下载。

标签: php json symfony streaming


【解决方案1】:

在上述所有 cmets 的帮助下,我能够实现我想要的。
这是相同的代码。

$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;

它创建了一个我可以下载的大文件。正是我想要的。发布解决方案,以便它可以帮助遇到同样问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2017-11-24
    • 2021-07-03
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多