PHP:读取大量的Excel文件导致致命的错误

我面临一个问题。

我需要读取大约10MB的.xls文件。 我写了一个PHP代码,当我读取小的.xls文件时工作正常。 但是当我尝试读取大文件,然后浏览器显示“致命错误:允许内存大小134217728字节用尽(试图分配1032字节)在C:\ wamp \ www \ student \ ExcelRes \ PHPExcel \ Cell.php行1126 “

这是我的代码。

<?php ini_set('memory_limit', '128M'); set_include_path(get_include_path() . PATH_SEPARATOR . 'ExcelRes/'); include 'PHPExcel/IOFactory.php'; $inputFileName = 'ru_unit_H_all.xls'; $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); echo $sheetData['20007'][ 'K']; //row colomn ?> 

错误信息应该自我解释:

“致命错误:在第1126行的C:\ wamp \ www \ student \ ExcelRes \ PHPExcel \ Cell.php中, 允许的内存大小为134217728个字节(尽力分配1032个字节)

你只是简单地用完了一个脚本的执行内存。

你可以使用ini_set()来增加你的memory_limit来解决这个问题。

注意:使用128MB是不够的,因为134217728B = ~128MB仍然会导致该错误。 尝试使用512MB

对于我所知的PHP的Excel读写器没有记忆有效的实现。

该脚本可用的内存已被取消。 默认情况下,我相信每个脚本都有8MB的内存限制。 您正试图读取10MB文件,因此没有足够的内存来处理请求,并且失败。

您可以尝试通过使用memory_limit设置来增加可用的内存量。

这可以通过全局的php.ini设置文件中的所有脚本完成,也可以使用每个脚本

 ini_set('memory_limit','16M'); 

16M是16兆内存。

除了可能增加的内存之外,您还应该仔细查看PHPExcel提供的单元caching选项,正如开发人员文档标题为“单元caching”(第4.2.1节)中所述的那样,

编辑

而你对toArray()的使用也会在PHP内存中build立你所请求的数组,增加额外的开销 – 考虑一次迭代工作表,而不是一次加载到内存中(一次作为PHPExcel对象一次作为你的数组)

最后我通过使用example12代码解决了我的问题。

 <?php set_include_path(get_include_path() . PATH_SEPARATOR . 'ExcelRes/'); include 'PHPExcel/IOFactory.php'; $inputFileType = 'Excel5'; $inputFileName = 'ru_unit_H_all.xls'; class chunkReadFilter implements PHPExcel_Reader_IReadFilter { private $_startRow = 0; private $_endRow = 0; public function setRows($startRow) { $this->_startRow = $startRow; } public function readCell($column, $row, $worksheetName = '') { if (($row == 1) || ($row >= $this->_startRow )) { return true; } return false; } } $objReader = PHPExcel_IOFactory::createReader($inputFileType); $chunkFilter = new chunkReadFilter(); $objReader->setReadFilter($chunkFilter); $chunkFilter->setRows(22000); $objPHPExcel = $objReader->load($inputFileName); echo $objPHPExcel->getActiveSheet()->getCell('K22000')->getValue(); } ?>