尽管分配了 1024MB RAM,PHPExcel 在加载 3MB XSLX 文件时仍然会遇到内存耗尽的情况。根本原因在于表示大型电子表格所涉及的内存密集型过程。
要解决此问题,可以采用多种优化技术:
如果只需要加载特定工作表,请使用 setLoadSheetsOnly() 限制读者读取的工作表数量。
$objReader->setLoadSheetsOnly([ 'Data Sheet #1', 'Data Sheet #3' ]);
要仅检索特定的单元格或行,可以使用读取过滤器。
class MyReadFilter implements PHPExcel_Reader_IReadFilter { // ... implementation } $objReader->setReadFilter(new MyReadFilter());
分块读取大型电子表格可以通过仅加载部分数据来最大限度地减少内存占用
$chunkSize = 20; $chunkFilter = new chunkReadFilter(); for ($startRow = 2; $startRow < 65536; $startRow += $chunkSize) { $chunkFilter->setRows($startRow, $chunkSize); $objPHPExcel = $objReader->load($inputFileName); }
将 readDataOnly 设置为 true 只加载单元格值而不格式化数据,减少内存使用。
$objReader->setReadDataOnly(true);
单元格缓存以压缩格式存储单元格对象,显着减少内存消耗,但会牺牲速度。
不要使用迭代器和手动构建数组,请考虑使用 PHPExcel 的 toArray () 或 rangeToArray() 方法可有效生成数组。
以上是如何优化 PHPExcel 以防止加载大型 XLSX 文件时内存耗尽?的详细内容。更多信息请关注PHP中文网其他相关文章!