Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';找不到修复PHPExcel内存泄漏的方法_Php_Memory Leaks_Phpexcel - Fatal编程技术网

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

Can';找不到修复PHPExcel内存泄漏的方法,php,memory-leaks,phpexcel,Php,Memory Leaks,Phpexcel,我在循环中使用以下方法,以便以块的形式读取excel文件(使用自定义读取筛选器,以免内存不足): 公共函数chunkToArray($file、$startRow、$chunkSize) { $file=\\\\\\'/../../'.$file; $objReader=PHPExcel_IOFactory::createReader('Excel2007'); $chunkFilter=新的ExcelChunkReadFilter(); $objReader->setReadFilter($c

我在循环中使用以下方法,以便以块的形式读取excel文件(使用自定义读取筛选器,以免内存不足):

公共函数chunkToArray($file、$startRow、$chunkSize)
{
$file=\\\\\\'/../../'.$file;
$objReader=PHPExcel_IOFactory::createReader('Excel2007');
$chunkFilter=新的ExcelChunkReadFilter();
$objReader->setReadFilter($chunkFilter);
$chunkFilter->setRows($startRow,$chunkSize);
$objPHPExcel=$objReader->load($file);
$array=$objPHPExcel->getActiveSheet()->rangeToArray('A'.$startRow'.:AT'.($startRow+$chunkSize-1));
$objPHPExcel->disconnectWorksheets();
未设置($objPHPExcel);
$objPHPExcel=null;
返回$array;
}
尽管调用了“disconnectWorksheets”并取消了php excel对象的设置和空值,但每次循环迭代都会出现内存泄漏

我已经使用了
echo memory\u get\u usage(true)
来隔离
$objPHPExcel=$objReader->load($file)行上的每次迭代中内存使用量都在增加,但在下一次迭代之前不会再次清除内存


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

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

看一看“PHP_excel替代方案”问题的答案。您可以使用或


如果无法切换到其他库,则可以使用PHPExcel的缓存机制。答案可以帮助您。

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