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 在线打包_支持子目录
Jun 28 PHP
PHP 组件化编程技巧
Jun 06 PHP
在PHP中利用wsdl创建标准webservice的实现代码
Dec 07 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
Feb 22 PHP
PHP中使用unset销毁变量并内存释放问题
Jul 05 PHP
php实现水仙花数的4个示例分享
Apr 08 PHP
PHP采用get获取url汉字出现乱码的解决方法
Nov 13 PHP
wampserver改变默认网站目录的办法
Aug 05 PHP
php传值方式和ajax的验证功能
Mar 27 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 PHP
Laravel中如何轻松容易的输出完整的SQL语句
Jul 26 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中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
PHP中的插件机制原理和实例
2014/07/08 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
10款实用的PHP开源工具
2015/10/23 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
pjblog修改技巧汇总
2007/03/12 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
JS实现霓虹灯文字效果的方法
2015/08/06 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
vue webuploader 文件上传组件开发
2017/09/23 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
[01:02:06]LGD vs Mineski Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
python运行时间的几种方法
2016/06/17 Python
Python之os操作方法(详解)
2017/06/15 Python
Python数据结构之单链表详解
2017/09/12 Python
python学生信息管理系统
2018/03/13 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
Python基于xlutils修改表格内容过程解析
2020/07/28 Python
Django框架请求生命周期实现原理
2020/11/13 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
Java的基础面试题附答案
2016/01/10 面试题
Ajax的工作原理
2015/12/04 面试题
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
计算机学生求职信范文
2014/01/30 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
2015年度优秀员工获奖感言
2015/07/31 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
python字符串常规操作大全
2021/05/02 Python
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python