转储PHP中的所有变量

时间:2014-07-17 00:31:55

标签: php memory memory-leaks xdebug

我的脚本中有内存泄漏,2天后我找不到它。我发现导致内存泄漏的循环;循环的每次迭代都会增加内存使用量。我将循环移动到一个函数来隔离变量。在函数结束时,我取消了该函数创建的每个变量,以便get_defined_vars()返回一个空数组。这就是我的意思:

function the_loop(){
  $var="value";

  ... // processing, including using a library

  unset($var);
  print_r(get_defined_vars()); // prints empty array
}

while(true){
  the_loop();
  echo memory_get_usage()."\n"; // steadily increases until memory limit is reached
}

我猜测the_loop()中定义的某些变量仍在内存中。我尝试使用XDebug的跟踪工具,但它没有帮助。它表明,从长远来看,内存使用量平均增加。我正在寻找一个可以向我显示PHP内存中所有值的工具。我将能够根据值识别变量。什么工具可以转储PHP的内存?

2 个答案:

答案 0 :(得分:3)

正如Dragon提到的那样,没有立即释放内存。

What's better at freeing memory with PHP: unset() or $var = null

我考虑重新评估您使用PHP的方式,它不适用于长/不间断运行的脚本,垃圾处理程序根本就不是很好。

如果您想进一步深入了解执行脚本,我建议您查看以下工具:

https://github.com/jokkedk/webgrind

http://xhprof.io/

http://derickrethans.nl/xdebug-and-tracing-memory-usage.html

另外值得一读:What gc_collect_cycles function is useful for?

答案 1 :(得分:0)

调用unset()不会强制进行垃圾收集,因此虽然引用计数应该减少,但可能还有其他人引用它。在调用未设置为xdebug_debug_zval($var)之前使用see how many references实际值为。