我的脚本中有内存泄漏,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的内存?
正如Dragon所说,unset不会立即释放内存。
unset()或$var = null我会考虑重新评估你使用PHP的方式,它不是为长时间/恒定运行的脚本设计的,垃圾处理程序根本不是那么好。
如果你想更深入地研究执行脚本,我建议检查一些工具,如:
https://github.com/jokkedk/webgrind http://xhprof.io/http://derickrethans.nl/xdebug-and-tracing-memory-usage.html同样值得一读:gc_collect_cycles函数有什么用?
调用unset()并不强制垃圾收集,因此当引用计数应该减少时,可能会有其他引用它。在调用unset之前使用xdebug_debug_zval($var)查看实际有多少对其值的引用。