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(); } ?>