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二分法在IP地址查询中的应用
Aug 12 PHP
php XPath对XML文件查找及修改实现代码
Jul 27 PHP
PHP读取文件并可支持远程文件的代码分享
Oct 03 PHP
php中导出数据到excel时数字变为科学计数的解决方法
Feb 03 PHP
ThinkPHP使用smarty模板引擎的方法
Jul 01 PHP
thinkphp实现发送邮件密码找回功能实例
Dec 01 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
php实现可逆加密的方法
Aug 11 PHP
thinkPHP实现MemCache分布式缓存功能
Mar 23 PHP
10个值得深思的PHP面试题
Nov 14 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
php+croppic.js实现剪切上传图片功能
Aug 14 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
JAVA/JSP学习系列之二
2006/10/09 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
JS运动相关知识点小结(附弹性运动示例)
2016/01/08 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
详解Vue监听数据变化原理
2017/03/08 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
Python实现字符串中某个字母的替代功能
2019/10/21 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
学习python需要有编程基础吗
2020/06/02 Python
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
介绍一下SQL Server的全文索引
2013/08/15 面试题
C#和SQL Server的面试题
2016/08/12 面试题
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
群众路线个人剖析材料
2014/10/07 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL
Python中的 enumerate和zip详情
2022/05/30 Python
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技