php中用unset销毁变量并释放内存


Posted in PHP onMay 10, 2020

PHP的unset()函数用来清除、销毁变量,不用的变量,我们可以用unset()将它销毁。但是某些时候,用unset()却无法达到销毁变量占用的内存!

我们先看一个例子:

<?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使用unset()删除数组中某个单元

unset既可以删除变量,也可以删除数组中某个单元。但要注意的是,数组不会重建索引。

实例如下:

<?php
$arr = array("朝阳区","海淀区","西城区","东城区","丰台区");
unset($arr[3]);
echo "<pre>";
print_r($arr);
?>

输出结果如下:

Array
(
 [0] => 朝阳区
 [1] => 海淀区
 [2] => 西城区
 [4] => 丰台区
)

到此这篇关于php中用unset销毁变量并释放内存的文章就介绍到这了,更多相关php如何用unset销毁变量并释放内存内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
JAVA/JSP学习系列之七
Oct 09 PHP
支持php4、php5的mysql数据库操作类
Jan 10 PHP
php 日期和时间的处理-郑阿奇(续)
Jul 04 PHP
记录PHP错误日志 display_errors与log_errors的区别
Oct 09 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
Jun 05 PHP
php内核解析:PHP中的哈希表
Jan 30 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
Aug 16 PHP
PHP中的数组处理函数实例总结
Jan 09 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
浅谈PHP错误类型及屏蔽方法
May 27 PHP
asp.net和php的区别点总结
Oct 10 PHP
PHP7 弃用功能
Mar 09 PHP
php屏蔽错误及提示的方法
May 10 #PHP
php判断数组是否为空的实例方法
May 10 #PHP
通过PHP实现获取访问用户IP
May 09 #PHP
如何通过PHP实现Des加密算法代码实例
May 09 #PHP
php变量与字符串的增删改查操作示例
May 07 #PHP
PHP数组与字符串互相转换实例
May 05 #PHP
禁止直接访问php文件代码分享
May 05 #PHP
You might like
php在线代理转向代码
2012/05/05 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
javascript放大镜效果的简单实现
2013/12/09 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
node.js+express制作网页计算器
2016/01/17 Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
2016/03/08 Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
2016/07/25 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
Python中序列的修改、散列与切片详解
2017/08/27 Python
python 获取list特定元素下标的实例讲解
2018/04/09 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
Python 通过监听端口实现唯一脚本运行方式
2020/05/05 Python
python unichr函数知识点总结
2020/12/16 Python
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
Reformation官网:美国女装品牌
2018/09/14 全球购物
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
异常和异常类的概念
2014/09/12 面试题
建筑个人求职信范文
2014/01/25 职场文书
挂职自我鉴定
2014/02/26 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
忠诚与背叛观后感
2015/06/04 职场文书
遗嘱格式范本
2015/08/07 职场文书
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang