【问题标题】:Can't find a way to fix PHPExcel memory leak找不到修复 PHPExcel 内存泄漏的方法
【发布时间】:2014-09-21 21:17:33
【问题描述】:

我在循环中使用以下方法以块读取 excel 文件(使用自定义读取过滤器,以免内存不足):

public function chunkToArray($file, $startRow, $chunkSize)
{

    $file = __DIR__ . '/../../' . $file;

    $objReader = PHPExcel_IOFactory::createReader('Excel2007');

    $chunkFilter = new ExcelChunkReadFilter();

    $objReader->setReadFilter($chunkFilter);
    $chunkFilter->setRows($startRow, $chunkSize);

    $objPHPExcel = $objReader->load($file);

    $array = $objPHPExcel->getActiveSheet()->rangeToArray('A' . $startRow . ':AT' . ($startRow + $chunkSize - 1));

    $objPHPExcel->disconnectWorksheets();

    unset($objPHPExcel);
    $objPHPExcel = null;

    return $array;
}

尽管调用了“disconnectWorksheets”并取消设置和清空 php excel 对象,但我仍然在每次循环迭代时遇到内存泄漏。

我使用echo memory_get_usage(true) 来隔离$objPHPExcel = $objReader->load($file); 行上的每次迭代内存使用量都在上升,但在下一次迭代之前内存不会再次被清除。

我真的很难确定这里发生了什么。非常感谢任何帮助。

【问题讨论】:

  • 当您断开工作表并取消设置 $objPHPExcel.... 时,应该清除一些内存。
  • 我是这么想的,但经过几次迭代,它最终还是会耗尽内存。如果我在“$objPHPExcel = $objReader->load($file);”之后立即测量它,我应该看到内存使用量的差异,我这样说是否正确?和“$objPHPExcel = null;”?因为此时这两个值在每次迭代中都是相同的。
  • 我不希望这些数字完全相同,因为您还在两者之间填充了 $array
  • "echo memory_get_usage(true)" 似乎总是给出相同的值,除非在 "$objPHPExcel = $objReader->load($file);" 之前的某个点一个是之后。数组填充是否没有区别,因为在每次迭代中,新数组的大小与前一次迭代中的相同,并且前一个正在被垃圾收集?感谢您的帮助。
  • 好吧,您的数组是由rangeToArray() 调用在每次迭代中创建的,并且仅在您退出函数并将其内容返回给调用函数时才被标记为垃圾收集......所以我d 当然希望在您第一次调用chunkToArray()时看到两次内存使用检查之间的一些差异

标签: php memory-leaks phpexcel


【解决方案1】:

PHPExcel 库在内存泄漏方面存在很大问题,因此我建议您切换到使用 .xlsx 文件的其他库。

查看this 对“PHP_excel 的替代方案”问题的回答。您可以使用PHP_XLSXWriterSpout

如果你不能切换到另一个库,那么你可以使用 PHPExcel 的缓存机制。 This 回答可以帮助你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 2018-04-07
    • 2013-07-29
    相关资源
    最近更新 更多