PHP中使用unset销毁变量并内存释放问题


Posted in PHP onJuly 05, 2012
for ( $i = 1; $i < 100; $i++ ) { 
$str = str_repeat('01234567', $i); 
$a = memory_get_usage(); 
unset($str); 
$b = memory_get_usage(); 
echo "\n 
".$i.': '.($b - $a).' Bytes.'; 
}

从结果看出:
8 x 32 = 256 在256字节长的时候才真正有必要释放内存,有些人说,不如直接$str = null来的速度快。
结果如下:
1: 0 Bytes.
2: 0 Bytes.
3: 0 Bytes.
4: 0 Bytes.
5: 0 Bytes.
6: 0 Bytes.
7: 0 Bytes.
8: 0 Bytes.
9: 0 Bytes.
10: 0 Bytes.
11: 0 Bytes.
12: 0 Bytes.
13: 0 Bytes.
14: 0 Bytes.
15: 0 Bytes.
16: 0 Bytes.
17: 0 Bytes.
18: 0 Bytes.
19: 0 Bytes.
20: 0 Bytes.
21: 0 Bytes.
22: 0 Bytes.
23: 0 Bytes.
24: 0 Bytes.
25: 0 Bytes.
26: 0 Bytes.
27: 0 Bytes.
28: 0 Bytes.
29: 0 Bytes.
30: 0 Bytes.
31: 0 Bytes.
32: -272 Bytes.
33: -280 Bytes.
34: -288 Bytes.
35: -296 Bytes.
36: -304 Bytes.
37: -312 Bytes.
38: -320 Bytes.
39: -328 Bytes.
40: -336 Bytes.
41: -344 Bytes.
42: -352 Bytes.
43: -360 Bytes.
44: -368 Bytes.
45: -376 Bytes.
46: -384 Bytes.
47: -392 Bytes.
48: -400 Bytes.
49: -408 Bytes.
50: -416 Bytes.
51: -424 Bytes.
52: -432 Bytes.
53: -440 Bytes.
54: -448 Bytes.
55: -456 Bytes.
56: -464 Bytes.
57: -472 Bytes.
58: -480 Bytes.
59: -488 Bytes.
60: -496 Bytes.
61: -504 Bytes.
62: -512 Bytes.
63: -520 Bytes.
64: -528 Bytes.
65: -536 Bytes.
66: -544 Bytes.
67: -552 Bytes.
68: -560 Bytes.
69: -568 Bytes.
70: -576 Bytes.
71: -584 Bytes.
72: -592 Bytes.
73: -600 Bytes.
74: -608 Bytes.
75: -616 Bytes.
76: -624 Bytes.
77: -632 Bytes.
78: -640 Bytes.
79: -648 Bytes.
80: -656 Bytes.
81: -664 Bytes.
82: -672 Bytes.
83: -680 Bytes.
84: -688 Bytes.
85: -696 Bytes.
86: -704 Bytes.
87: -712 Bytes.
88: -720 Bytes.
89: -728 Bytes.
90: -736 Bytes.
91: -744 Bytes.
92: -752 Bytes.
93: -760 Bytes.
94: -768 Bytes.
95: -776 Bytes.
96: -784 Bytes.
97: -792 Bytes.
98: -800 Bytes.
99: -808 Bytes.

我们先看一个例子

<?php 
$s=str_repeat('1',255); //产生由255个1组成的字符串 
$m=memory_get_usage(); //获取当前占用内存 
unset($s); 
$mm=memory_get_usage(); //unset()后再查看当前占用内存 
echo $m-$mm; 
?>

最后输出unset()之前占用内存减去unset()之后占用内存,如果是正数,那么说明unset($s)已经将$s从内存中销毁(或者说,unset()之后内存占用减少了),可是我在PHP5和windows平台下,得到的结果是:-48。这是否可以说明,unset($s)并没有起到销毁变量$s所占用内存的作用呢?我们再作下面的例子:
<?php 
$s=str_repeat('1',256); //产生由256个1组成的字符串 
$m=memory_get_usage(); //获取当前占用内存 
unset($s); 
$mm=memory_get_usage(); //unset()后再查看当前占用内存 
echo $m-$mm; 
?>

这个例子,和上面的例子几乎相同,唯一的不同是,$s由256个1组成,即比第一个例子多了一个1,得到结果是:224。这是否可以说明,unset($s)已经将$s所占用的内存销毁了?
通过上面两个例子,我们可以得出以下结论:结论一、unset()函数只能在变量值占用内存空间超过256字节时才会释放内存空间。
那么是不是只要变量值超过256,使用unset就可以释放内存空间呢?我们再通过一个例子来测试一下:
<?php 
$s=str_repeat('1',256); //这和第二个例子完全相同 
$p=&$s; 
$m=memory_get_usage(); 
unset($s); //销毁$s 
$mm=memory_get_usage(); 
echo $p.'<br />'; 
echo $m-$mm; 
?>

'刷新页面,我们看到第一行有256个1,第二行是-48,按理说我们已经销毁了$s,而$p只是引用$s的变量,应该是没有内容了,另外,unset($s)后内存占用却比unset()前增加了!现在我们再做以下的例子:
<?php 
$s=str_repeat('1',256); //这和第二个例子完全相同 
$p=&$s; 
$m=memory_get_usage(); 
$s=null; //设置$s为null 
$mm=memory_get_usage(); 
echo $p.'<br />'; 
echo $m-$mm; 
?>

现在刷新页面,我们看到,输出$p已经是没有内容了,unset()前后内存占用量之差是224,即已经清除了变量占用的内存。本例中的$s=null也可以换成unset(),如下:
<?php 
$s=str_repeat('1',256); //这和第二个例子完全相同 
$p=&$s; 
$m=memory_get_usage(); 
unset($s); //销毁$s 
unset($p); 
$mm=memory_get_usage(); 
echo $p.'<br />'; 
echo $m-$mm; 
?>

我们将$s和$p都使用unset()销毁,这时再看内存占用量之差也是224,说明这样也可以释放内存。那么,我们可以得到另外一条结论:结论二、只有当指向该变量的所有变量(如引用变量)都被销毁后,才会释放内存。
相信经过本文的例子后,大家应该对unset()有所了解了,最起码,本人用unset()也是为了在变量不起作用时,释放内存。
PHP 相关文章推荐
php xml留言板 xml存储数据的简单例子
Aug 24 PHP
php 文件上传类代码
Aug 06 PHP
shopex中集成的站长统计功能的代码简单分析
Aug 11 PHP
PHP获取时间排除周六、周日的两个方法
Jun 30 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
Jan 08 PHP
ThinkPHP 模板引擎使用详解
May 07 PHP
PHP微信模板消息操作示例
Jun 29 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
PHP实现按之字形顺序打印二叉树的方法
Jan 16 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
Oct 15 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
TP5框架实现的数据库备份功能示例
Apr 05 PHP
php Ubb代码编辑器函数代码
Jul 05 #PHP
PHP取整数函数常用的四种方法小结
Jul 05 #PHP
PHP函数学习之PHP函数点评
Jul 05 #PHP
php中根据变量的类型 选择echo或dump
Jul 05 #PHP
PHP写的求多项式导数的函数代码
Jul 04 #PHP
php中禁止单个IP与ip段访问的代码小结
Jul 04 #PHP
提高php运行速度的一些小技巧分享
Jul 03 #PHP
You might like
浅析PHP 按位与或 (^ 、&amp;)
2013/06/21 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
原生js实现trigger方法示例代码
2019/05/22 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
2020/08/28 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
Python饼状图的绘制实例
2019/01/15 Python
如何基于Python实现数字类型转换
2020/02/07 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
秋季红领巾广播稿
2014/01/27 职场文书
社区活动策划方案
2014/08/21 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
教您怎么制定西餐厅运营方案 ?
2019/07/05 职场文书
Python异常类型以及处理方法汇总
2021/06/05 Python
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers