我的脚本中有内存泄漏,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的内存?
答案 0 :(得分:3)
正如Dragon提到的那样,没有立即释放内存。
What's better at freeing memory with PHP: unset() or $var = null
我考虑重新评估您使用PHP的方式,它不适用于长/不间断运行的脚本,垃圾处理程序根本就不是很好。
如果您想进一步深入了解执行脚本,我建议您查看以下工具:
https://github.com/jokkedk/webgrind
http://derickrethans.nl/xdebug-and-tracing-memory-usage.html
答案 1 :(得分:0)
调用unset()不会强制进行垃圾收集,因此虽然引用计数应该减少,但可能还有其他人引用它。在调用未设置为xdebug_debug_zval($var)之前使用see how many references实际值为。