可以传递到特殊输出流的数据量是否有限制php://output?

可以传递到特殊输出流的数据量是否有限制php://output?,php,csv,symfony1,http-headers,Php,Csv,Symfony1,Http Headers,我目前正在测试一个新的导出到CSV功能,用于通过webapp生成的报告。相关代码如下所示: $my_report_data = ReportDAO::runCampaignAnalysis($campaign_id, $start_date, $end_date); $this->getResponse()->clearHttpHeaders(); $this->getResponse()->setHttpHeader('Content-Type', 'applicat

我目前正在测试一个新的导出到CSV功能,用于通过webapp生成的报告。相关代码如下所示:

$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_数据只是表单的多维数组

该代码适用于小型数据集,例如100行及以下的数据集(不太确定截止位置)。拥有更大的数据集;但是,当我尝试导出到CSV时,浏览器不会显示文件打开/保存对话框,而是会在网页上显示原始报告内容


我用Firefox的“Live HTTP headers”插件检查了HTTP头,发现对于较大的数据集,头没有正确设置,显示为“text/html”;字符集=utf-8'而不是'application/vnd.ms excel'。非常奇怪。

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

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

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

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

ob_start('ob_gzhandler');

工作起来很有魅力。

谢谢你的建议,Femi,但正如你指出的那样,将其纳入我当前的解决方案将相当混乱。不确定刷新缓冲区将如何解决标题神秘地恢复为“text/html”的问题。FWIW虽然我之前确实尝试过,但没有成功。