即时通讯使用 PHPExcel读取.xls文件.我见面的时间很短
Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 730624 bytes) in Excel\PHPExcel\Shared\OLERead.PHP on line 93

经过一些谷歌搜索,我尝试chunkReader来防止这种情况(甚至在PHPExcel主页上提到),但我仍然坚持这个错误.

我的想法是,通过大块阅读器,我将逐个阅读文件,我的记忆不会溢出.但是必须有一些严重的记忆漏洞?或者我释放一些记忆力不好?我甚至试图将服务器ram提升到1GB.我试图阅读的文件大小约为700k,这不是那么多(我也读取~20MB pdf,xlsx,docx,doc等文件没有问题).所以我假设我可能会忽略一些小的巨魔.

代码看起来像这样

function parseXLS($fileName){
    require_once dirname(__FILE__) . './sphider_design/include/Excel/PHPExcel/IOFactory.PHP';
    require_once dirname(__FILE__) . './sphider_design/include/Excel/PHPExcel/ChunkReadFilter.PHP';

    $inputFileType = 'Excel5';

    /**  Create a new Reader of the type defined in $inputFileType  **/
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);
    /**  Define how many rows we want to read for each "chunk"  **/ 
    $chunkSize = 20;
    /**  Create a new Instance of our Read Filter  **/ 
    $chunkFilter = new chunkReadFilter(); 
    /**  Tell the Reader that we want to use the Read Filter that we've Instantiated  **/ 
    $objReader->setReadFilter($chunkFilter); 

    /**  Loop to read our worksheet in "chunk size" blocks  **/ 
    /**  $startRow is set to 2 initially because we always read the headings in row #1  **/
    for ($startRow = 2; $startRow <= 65536; $startRow += $chunkSize) { 
        /**  Tell the Read Filter,the limits on which rows we want to read this iteration  **/ 
        $chunkFilter->setRows($startRow,$chunkSize); 
        /**  Load only the rows that match our filter from $inputFileName to a PHPExcel Object  **/ 
        $objPHPExcel = $objReader->load($fileName); 
        //    Do some processing here 

        //    Free up some of the memory 
        $objPHPExcel->disconnectWorksheets(); 
        unset($objPHPExcel); 
    }
}

这里是chunkReader的代码

class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
    private $_startRow = 0;
    private $_endRow = 0;

    /**  Set the list of rows that we want to read  */ 
    public function setRows($startRow,$chunkSize) { 
        $this->_startRow    = $startRow; 
        $this->_endRow      = $startRow + $chunkSize;
    } 

    public function readCell($column,$row,$worksheetName = '') {
        //  Only read the heading row,and the rows that are configured in $this->_startRow and $this->_endRow 
        if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) { 
           return true;
        }
        return false;
    } 
}
所以我在 How to read large worksheets from large Excel files (27MB+) with PHPExcel?找到了有趣的解决方案

作为附录3的问题

edit1:也有了这个解决方案,我用我最喜欢的errr消息来阻塞,但我发现了一些关于缓存的东西,所以我实现了这个

$cacheMethod = PHPExcel_CachedobjectStorageFactory::cache_to_PHPTemp;
$cacheSettings = array(' memoryCacheSize ' => '8MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod,$cacheSettings);

最近我测试它仅适用于小于10MB的xls文件,但它似乎工作(我也设置$objReader-> setReadDataOnly(true);)它似乎足够平衡以实现速度和内存消耗. (如果可能的话,我将更多地遵循我的棘手路径)

EDIT2:
所以我做了一些进一步的研究,发现我的方式不需要大块阅读器. (对我而言,内存问题与大块阅读器相同,没有它.)所以我对我的问题的最终答案是这样的,它读取.xls文件(只有来自单元格的数据,没有格式化,甚至过滤公式).当我使用cache_tp_PHP_temp我能够在几秒钟内读取xls文件(测试到10MB)和大约10k行和多列并且没有内存问题

function parseXLS($fileName){

/** PHPExcel_IOFactory */
    require_once dirname(__FILE__) . './sphider_design/include/Excel/PHPExcel/IOFactory.PHP';
    require_once dirname(__FILE__) . './sphider_design/include/Excel/PHPExcel/ChunkReadFilter.PHP';
    require_once dirname(__FILE__) . './sphider_design/include/Excel/PHPExcel.PHP';

    $inputFileName = $fileName;
    $fileContent = "";

    //get inputFileType (most of time Excel5)
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName);

    //initialize cache,so the PHPExcel will not throw memory overflow
    $cacheMethod = PHPExcel_CachedobjectStorageFactory::cache_to_PHPTemp;
    $cacheSettings = array(' memoryCacheSize ' => '8MB');
    PHPExcel_Settings::setCacheStorageMethod($cacheMethod,$cacheSettings);

    //initialize object reader by file type
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);

    //read only data (without formating) for memory and time performance
    $objReader->setReadDataOnly(true);

    //load file into PHPExcel object
    $objPHPExcel = $objReader->load($inputFileName);

    //get worksheetIterator,so we can loop sheets in workbook
    $worksheetIterator = $objPHPExcel->getWorksheetIterator();

    //loop all sheets
    foreach ($worksheetIterator as $worksheet) {    

            //use worksheet rowIterator,to get content of each row
            foreach ($worksheet->getRowIterator() as $row) {
                //use cell iterator,to get content of each cell in row
                $cellIterator = $row->getCellIterator();
                //dunno
                $cellIterator->setIterateOnlyExistingCells(false);      

                //iterate each cell
                foreach ($cellIterator as $cell) {
                    //check if cell exists
                    if (!is_null($cell)) {
                        //get raw value (without formating,and all unnecessary trash)
                        $rawValue = $cell->getValue();
                        //if cell isnt empty,print its value
                        if ((trim($rawValue) <> "") and (substr(trim($rawValue),1) <> "=")){
                            $fileContent .= $rawValue . " ";                                            
                        }
                    }
                }       
            }       
    }

    return $fileContent;
}

通过PHPExcel读取.xls文件会引发致命错误:允许内存大小…即使使用块读取器也是如此的更多相关文章

  1. xcode4 – 如何将excel文件类型(xlsx)与iPhone应用程序相关联

    您好,我已经通过向项目构建添加文档类型并将Types字段设置为“com.microsoft.excel.xls”(请参阅屏幕截图),通过邮件应用程序打开.xls文件.我想对xlsx文件做同样的处理,但不能做.我尝试添加“com.microsoft.excel.xlsx”但是没有起作用解决方法我通过定义自定义UTI解决了如下.尝试将这些定义添加到您的info.plist中.它按预期工作.….

  2. phpexcel导入excel处理大数据(实例讲解)

    下面小编就为大家带来一篇phpexcel导入excel处理大数据(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. HTML里显示pdf、word、xls、ppt的方法示例

    这篇文章主要介绍了HTML里显示pdf、word、xls、ppt的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. PHPExcel 修改已存在Excel的方法

    下面小编就为大家分享一篇PHPExcel 修改已存在Excel的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  5. Yii框架中使用PHPExcel的方法分析

    这篇文章主要介绍了Yii框架中使用PHPExcel的方法,简单分析了Yii使用PHPExcel的相关操作技巧与注意事项,并附带说明了Yii的autoload机制,需要的朋友可以参考下

  6. thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)

    这篇文章主要介绍了thinkPHP+PHPExcel实现读取文件日期的方法,可实现针对时分秒的形式进行读取的功能,涉及PHPExcel中ExcelToPHP函数的相关使用方法,需要的朋友可以参考下

  7. PHPExcel笔记, mpdf导出

    这篇文章主要介绍了PHPExcel笔记, mpdf导出,需要的朋友可以参考下

  8. PHPExcel合并与拆分单元格的方法

    这篇文章主要介绍了PHPExcel合并与拆分单元格的方法,涉及PHPExcel中setCellValue与mergeCells方法的使用技巧,需要的朋友可以参考下

  9. PHPExcel导出2003和2007的excel文档功能示例

    这篇文章主要介绍了PHPExcel导出2003和2007的excel文档功能,结合实例形式分析了PHPExcel属性设置及文档导出操作相关技巧,需要的朋友可以参考下

  10. thinkPHP+phpexcel实现excel报表输出功能示例

    这篇文章主要介绍了thinkPHP+phpexcel实现excel报表输出功能,结合具体实例形式分析了thinkPHP整合PHPExcel实现针对Excel文件相关操作技巧,需要的朋友可以参考下

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部