可以传递到特殊输出流的数据量是否有限制php://output?
我目前正在测试一个新的导出到CSV功能,用于通过webapp生成的报告。相关代码如下所示:可以传递到特殊输出流的数据量是否有限制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
$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虽然我之前确实尝试过,但没有成功。