未能删除缓冲区。没有要删除的缓冲区

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

【讨论】:

以上是关于未能删除缓冲区。没有要删除的缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

开机时出现【没有找到libprotobuf.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。】

使用winsock发送缓冲区后可以删除内存吗?

何时删除缓冲区对象?

BigQuery:插入行,但不写

删除不在 BigQuery 流式缓冲区中的行

顶点缓冲区对象(删除进程)opengl