未能删除缓冲区。没有要删除的缓冲区
Posted
技术标签:
【中文标题】未能删除缓冲区。没有要删除的缓冲区【英文标题】:failed to delete buffer. No buffer to delete 【发布时间】:2013-01-11 00:41:09 【问题描述】:我正在尝试从下面的代码生成扩展名为 .xlsx 的 excel 文件。我可以很好地下载文件,但是当我用 Excel 表打开它时,我收到以下警告错误。Excel 无法打开文件“dindi.xlsx”,因为文件格式或文件扩展名无效。确保文件未损坏并且文件扩展名与文件格式匹配。 当我用记事本打开它时,文件有以下错误:
注意:ob_end_clean() [ref.outcontrol]:删除缓冲区失败。没有要删除的缓冲区
下面是我正在尝试做的代码。
public function exportResults()
$this -> load -> database();
$query = $this -> db -> query("
SELECT * FROM farm LIMIT 10");
$results = $query -> result_array();
$objphpExcel = new Excel();
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel = $objReader->load('./files/farmdetails.xlsx');
$objPHPExcel ->getActiveSheet()->setTitle('farmreport');
$objPHPExcel -> setActiveSheetIndex(0);
$i = 1;
foreach ($results as $result)
$objPHPExcel -> getActiveSheet() -> SetCellValue('A' . $i, $result["name"]);
$objPHPExcel -> getActiveSheet() -> SetCellValue('B' . $i, $result["dateofcontract"]);
$objPHPExcel -> getActiveSheet() -> SetCellValue('C' . $i, $result["leasorname"]);
$objPHPExcel -> getActiveSheet() -> SetCellValue('D' . $i, $result["acre"]);
$objPHPExcel -> getActiveSheet() -> SetCellValue('E' . $i, $result["zone"]);
$i++;
echo $result["name"];
ob_end_clean();
$filename = "dindi.xlsx";
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename=' . $filename);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_end_clean();
$objWriter -> save('php://output');
$objPHPExcel -> disconnectWorksheets();
unset($objPHPExcel);
【问题讨论】:
【参考方案1】:该错误只是告诉您没有要删除的缓冲区。 为了避免它,只需使用:
if (ob_get_contents()) ob_end_clean();
(检查是否有活动的输出缓冲区) 或:
if (ob_get_length()) ob_end_clean();
(检查缓冲区中是否有非空字符串) 正如@Venu 所建议的那样。
你也在那里打电话给ob_end_clean();
两次。这仅适用于可堆叠缓冲区。来自 PHP 手册:
此函数丢弃最顶层输出缓冲区的内容并 关闭此输出缓冲。
您确定不想只使用ob_clean()?
【讨论】:
+1;但是如果 (ob_get_length() > 0) ob_end_clean(); 可能会更好【参考方案2】:添加这段代码。 当 minifyhtml 处于活动状态时,会在实时站点上发生。可以连接到 advagg 和 httprl 请求。
建议的修复是用ob_get_length()
条件包装ob_clean()
。
if(ob_get_length() > 0)
ob_clean();
【讨论】:
为我工作。谢谢。【参考方案3】:来自PHP Documentation comment section,感谢scoalaweb dot com 的cornel:
请勿使用ob_clean()
或ob_end_clean()
清除包含文件“意外”生成的空白或其他不需要的内容。
包含的文件首先不应生成不需要的内容。
如果他们这样做了,你做错了什么,比如在“?>
”之后插入空格(PHP 文件末尾不应该有“?>
”),或者其他没有遵循的错误basic syntax rules of PHP.
【讨论】:
【参考方案4】:改变
ob_end_clean();
有了这个
if (ob_get_contents()) ob_end_clean();
【讨论】:
【参考方案5】:你的代码没有ob_start,当然没有要删除的缓冲区。
请查看http://php.net/manual/en/function.ob-start.php
【讨论】:
以上是关于未能删除缓冲区。没有要删除的缓冲区的主要内容,如果未能解决你的问题,请参考以下文章