找不到修复PHPExcel内存泄漏的方法

我在循环中使用以下方法以便以块的形式读取excel文件(使用自定义读取过滤器) 所以我不会耗尽内存):</ p>

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

$ file = DIR。 '/../../'。 $ file;

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

$ chunkFilter = new ExcelChunkReadFilter();

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

$ objPHPExcel = $ objReader-&gt; load($ file);

$ array = $ objPHPExcel-&gt; getActiveSheet() - &gt; rangeToArray ('A'。$ startRow。':AT'。($ startRow + $ chunkSize - 1));

$ objPHPExcel-&gt; disconnectWorksheets();

unset($ objPHPExcel);
$ objPHPExcel = null;

返回$ array;
}
</ code> </ pre>

尽管调用“disconnectWorksheets”并取消设置和取消php excel对象,我仍然 每次循环迭代都会出现内存泄漏。</ p>

我使用 echo memory_get_usage(true)</ code>来隔离行上每次迭代时内存使用量的增加 $ objPHPExcel = $ objReader-&gt; load($ file); </ code>,但在下一次迭代之前内存没有被清除。</ p>

我真的 努力识别 你在这里发生了什么 任何帮助都非常感谢。</ p>
</ div>

展开原文

原文

I am using the following method inside a loop in order to read an excel file in chunks (using a custom read filter so that I don't run out of memory):

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;
}

Despite calling "disconnectWorksheets" and unsetting and nulling the php excel object, I'm still getting a memory leak on each loop iteration.

I have used echo memory_get_usage(true) to isolate that the memory usage is going up on each iteration on the line $objPHPExcel = $objReader->load($file);, but the memory is not being cleared again before the next iteration.

I'm really struggling to identify what's going on here. Any help greatly appreciated.

douche3244
douche3244 不,我不这么认为,我认为最终内存增加只是非常轻微,我可能已经用ini_set()增加了内存限制并忍受了它。
5 年多之前 回复
dongzai0020
dongzai0020 你有没弄明白为什么记忆力不断增加?
5 年多之前 回复
dshnx48866
dshnx48866 啊,这解释了很多:我的一点点愚蠢的错误。如果没有真正的论证,我会再次衡量这一切
大约 6 年之前 回复
dstnlhhv791576
dstnlhhv791576 有关memory_get_usage()的更好说明,请参阅此问题的答案
大约 6 年之前 回复
duanlu9557
duanlu9557 但另请注意,memory_get_usage返回分配给php的内存量,不一定是使用的量。如果你没有传入true参数,那么你应该回到代码当前使用的确切内存量
大约 6 年之前 回复
douhai9043
douhai9043 那么你的数组是通过rangeToArray()调用每次迭代创建的,并且当你退出将其内容返回给你的调用函数的函数时,它只被标记为垃圾收集....所以我当然希望看到它们之间的一些区别第一次调用chunkToArray()时的两次内存使用情况检查
大约 6 年之前 回复
dongse7261
dongse7261 “echomemory_get_usage(true)”似乎总是给出相同的值,除非在“$objPHPExcel=$objReader->load($file);”之前的某个点。一个是在之后。数组填充是否可以没有区别,因为在每次迭代中,新数组的大小与上一次迭代的大小相同,而前一个是垃圾收集?谢谢你的帮助。
大约 6 年之前 回复
doushou8730
doushou8730 我不希望这些数字完全相同,因为你也在中间填充$数组
大约 6 年之前 回复
dongyu9263
dongyu9263 这就是我的想法,但经过几次迭代后,它最终仍会耗尽内存。如果我在“$objPHPExcel=$objReader->load($file);”之后立即测量内存使用情况,我会说我应该看到内存使用量的差异吗?和“$objPHPExcel=null;”?因为这两个值在每次迭代时都是相同的。
大约 6 年之前 回复
duanjuduo4573
duanjuduo4573 当您断开工作表并取消设置$objPHPExcel时,应清除一些内存....在此方法中的哪些点,您实际上是在检查内存使用情况?
大约 6 年之前 回复

1个回答



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

查看对“替代PHP_excel”问题的回答。 您可以使用 PHP_XLSXWriter Spout 。</ p>

如果无法切换到另一个库,则可以使用PHPExcel的缓存机制。 这个答案可以帮助您。</ p>
</ div>

展开原文

原文

The PHPExcel library has a big problem with memory leaks so I advise you to switch to other libraries that are working with .xlsx files.

Have a look at this answer to the question "Alternative for PHP_excel". You can use PHP_XLSXWriter or Spout.

If you can't switch to another library then you can use the caching mechanism of PHPExcel. This answer can help you with that.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问