1.背景

在复杂逻辑运算中,变量内存要及时释放,否则会影响运行时间,甚至溢出而报错。

2.方案

2.1内存溢出判断

可以通过此memory_get_usage()函数查看实时内存,再就是开启报错功能,若显示PHP Fatal error: Allowed memory size of 134217728 bytes exhausted则已超最大内存。

2.2解决方案

1)unset()函数,销毁变量。此函数将变量或数组元素的引用计数减1,但在循环体内不起作用。

2)函数内部的局部变量在函数执行完成会自动释放。

3)=null变量置空值,将变量指向的数据结构置空,引用计数归0。

4)脚本执行结束后,所有内存都会释放。

5)gc_collect_cycles()函数(推荐),可以强制php进行垃圾回收,释放无用内存,消除所有引用变量与对象。与unset()函数二选一。

6)数据库连接用完必须关闭,析构函数在很多情况下无效。经实验未关闭数据库连接是关闭的内存消耗约100倍。

通过示例表明,5)是有效果的,在复杂场景要及时释放无用内存。

echo __LINE__.' '.memory_get_usage();
function a(){
$a = str_repeat("Hello world", 42420);
echo $a;
echo __LINE__.' '.memory_get_usage();
unset($a);
//gc_collect_cycles();
echo __LINE__.' '.memory_get_usage();
}//a
a();
echo __LINE__.' '.memory_get_usage();
unset($a);
echo __LINE__.' '.memory_get_usage();
echo 'is local variable $a empty? $a:'.$a;
//输出+++++++
2 348600
hello world 省略后面
7 1274408
10 未执行unset 1274408,执行unset 807464
13 807464
15 807464
is local variable $a empty? $a

3.总结

及时用unset()必有效果,但要对所有变量操作一遍,gc_collect_cycles()虽然是自己回收,但有时系统也分不清,哪些变量无用,哪些有用。

综上,及时关闭数据库连接(循环体内也要关)、unset()来防止内存溢出。