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 相关文章推荐
PHP Header用于页面跳转要注意的几个问题总结
Oct 03 PHP
PHP里的中文变量说明
Jul 23 PHP
PHP 二维数组根据某个字段排序的具体实现
Jun 03 PHP
destoon文章模块调用企业会员资料的方法
Aug 22 PHP
php合并数组中相同元素的方法
Nov 13 PHP
php计算函数执行时间的方法
Mar 20 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
Apr 17 PHP
PHP SOCKET编程详解
May 22 PHP
PHP创建word文档的方法(平台无关)
Mar 29 PHP
php json中文编码为null的解决办法
Dec 14 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
PHP设计模式之单例模式定义与用法分析
Mar 26 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
香妃
2021/03/03 冲泡冲煮
php 学习资料零碎东西
2010/12/04 PHP
PHP多进程编程实例详解
2017/07/19 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
JavaScript对象学习经验整理
2013/10/12 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
实例详解BootStrap的动态模态框及静态模态框
2018/08/13 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
JavaScript函数IIFE使用详解
2019/10/21 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
uni-app微信小程序登录授权的实现
2020/05/22 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
[16:14]教你分分钟做大人:米拉娜(HEROS)
2014/11/24 DOTA
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
python创造虚拟环境方法总结
2019/03/04 Python
python面向对象法实现图书管理系统
2019/04/19 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
澳大利亚领先的折扣药房:Chemist Direct(有中文站)
2018/11/24 全球购物
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
自我评价优秀范文分享
2013/11/30 职场文书
自我评价怎么写好呢?
2013/12/05 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
跟单业务员岗位职责
2014/03/08 职场文书
地球一小时宣传标语
2014/06/24 职场文书
运动会稿件100字
2014/09/24 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
一行代码python实现文件共享服务器
2021/04/22 Python