【问题标题】:Is there a limit to the amount of data that can be passed on to the special output stream php://output?可以传递到特殊输出流 php://output 的数据量是否有限制?
【发布时间】:2012-05-01 02:36:30
【问题描述】:

我目前正在测试通过 web 应用生成的报告的新导出到 CSV 功能。相关代码如下:

$my_report_data = ReportDAO::runCampaignAnalysis($campaign_id, $start_date, $end_date);

$this->getResponse()->clearHttpHeaders();
$this->getResponse()->setHttpHeader('Content-Type', 'application/vnd.ms-excel');
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename='export.csv');

$outstream = fopen("php://output", "w");

function __outputCSV(&$vals, $key, $filehandler) {
     $retval = fputcsv($filehandler, $tempArray);
     if($retval == FALSE) {
         error_log('Uh oh, spaghetti o!');
         error_log('The current line being processed is: ' . join('|', $vals));
     }
 }

 array_walk($my_report_data, "__outputCSV", $outstream);
 fclose($outstream);

 return sfView::HEADER_ONLY;

$my_report_data 只是seen here 形式的多维数组。

该代码与小型数据集完美配合,例如100 行及以下(不幸的是,不太确定截止点在哪里)。拥有更大的数据集;但是,当我尝试导出为 CSV 时,我的浏览器并没有显示文件打开/保存对话框,而是在网页上显示原始报告内容。

我使用 Firefox 的“Live HTTP Headers”插件检查了 HTTP 标头,发现对于较大的数据集,标头设置不正确并显示为“text/html;”。 charset=utf-8' 而不是 'application/vnd.ms-excel'。很奇怪。

【问题讨论】:

    标签: php csv symfony1 http-headers


    【解决方案1】:

    奇怪:您可能想尝试定期刷新输出缓冲区。我发现我需要这样做以防止类似的错误。大致如下:

    if($len > 250){ $len = 0; if(ob_get_length()) ob_flush(); }
    

    其中$len 是行数。将其放入您的 array_walk 很麻烦,但这可能会有所帮助。

    【讨论】:

    • 感谢您的建议 Femi,但就像您指出的那样,将其融入我当前的解决方案会相当混乱。不确定如何刷新缓冲区将解决标题神秘地恢复为“文本/html”的问题。 FWIW 虽然我之前确实尝试过但没有成功。
    【解决方案2】:

    我相信我已经找到了可能的解决方案。不完全确定它为什么起作用;但确实如此。我只是在调用 clearHttpHeaders 之前添加了以下内容:

    ob_start('ob_gzhandler');
    

    工作就像一个魅力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-18
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      相关资源
      最近更新 更多