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()来防止内存溢出。