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&amp;MYSQL服务器配置说明
Oct 09 PHP
如何使用PHP中的字符串函数
Nov 24 PHP
php下判断数组中是否存在相同的值array_unique
Mar 25 PHP
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
php json转换成数组形式代码分享
Nov 10 PHP
PHP解析目录路径的3个函数总结
Nov 18 PHP
thinkphp数据查询和遍历数组实例
Nov 28 PHP
php使用pdo连接并查询sql数据库的方法
Dec 24 PHP
php5.3不能连接mssql数据库的解决方法
Dec 27 PHP
Thinkphp调用Image类生成缩略图的方法
Mar 07 PHP
php简单计算权重的方法示例【适合抽奖类应用】
Jun 10 PHP
详解PHP Swoole与TCP三次握手
May 27 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
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
php中引用符号(&amp;)的使用详细介绍
2016/12/06 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
vue非父子组件通信问题及解决方法
2018/06/11 Javascript
layui prompt 设置允许空白提交的方法
2019/09/24 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
Python实现读取json文件到excel表
2017/11/18 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
一套SQL笔试题
2016/08/14 面试题
常用UNIX 命令(Linux的常用命令)
2013/07/10 面试题
先进集体事迹材料
2014/02/17 职场文书
同意迁入证明模板
2014/10/26 职场文书
贷款担保书
2015/01/20 职场文书
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python
yolov5返回坐标的方法实例
2022/03/17 Python
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis
Win11控制面板快捷键是什么?Win11打开控制面板的方法汇总
2022/07/07 数码科技