【问题标题】:PHPExcel unset object not workingPHPExcel未设置对象不起作用
【发布时间】:2015-01-04 13:49:11
【问题描述】:

我正在尝试清除 phpexcel 中的对象。多次迭代对象会导致内存不足错误。

文档建议使用 disconnectWorksheets,但它不起作用。

代码如下:

...
$sheet = $instReader->getSheet($sheetOpts['sheet']);
...
echo "memo1:".ys_getmemusage()."\n";    
echo "size=". strlen(serialize($instReader))."\n"; 
$instReader->disconnectWorksheets(); 
unset($instReader);          
unset($sheet);

gc_enable();
gc_collect_cycles();

echo "memo2:".ys_getmemusage()."\n"; 
exit;

该文件是一个被PHPExcel_IOFactory::identify as Excel2007识别的excel文件

输出是:

memo1:memoryused=45.34888458251953 (45meg)

size=5962925
memo2:memoryused=45.34407043457031 (45meg)

有人知道如何解决这个问题吗?

ys_getmemusage 函数只是获取如下使用的内存。

$GLOBALS['raymemory_usage'] = memory_get_usage();
function ys_getmemusage() { 
    $end_memory = memory_get_usage() - $GLOBALS['raymemory_usage'];
    $end_memory = $end_memory/(1024*1024);
    return "memoryused=$end_memory\n";
}

【问题讨论】:

    标签: memory-leaks phpexcel


    【解决方案1】:

    找到解决办法

    我换了

    $instReader->disconnectWorksheets();
    unset($instReader);
    

    $instReader->__destruct();
    unset($instReader);
    

    一切似乎都很好。

    【讨论】:

      【解决方案2】:

      我能够使用接受的答案https://stackoverflow.com/a/27766461/4912853 和来自Dump all variables in PHP 的提示修复我的内存泄漏:

      PHP 在函数结束时释放内存,因此the_loop()

      之前:

      foreach($rows as $row){
          ...
          $instReader->disconnectWorksheets();
          unset($instReader);
      }
      

      之后:

      function createExcelFile($row){
          ...
          $instReader->__destruct();
          unset($instReader);
      }
      
      foreach($rows as $row){
          createExcelFile($row);
      }
      

      上述声明绝对可以使用来源,但是经过多次试验和错误,这两个想法一起完全解决了我的记忆问题。希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-14
        • 1970-01-01
        • 2017-03-29
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多