我们对unset() 这个函数的作用的了解大概就是它可以销毁一个变量,释放内存,这种理解并没有错,可能就是不够深入,接下来我通过几个例子向大家展示下unset一个变量后真正发生的一些事情。以下的代码是在linux+php7.1环境下运行

$s = str_repeat('1',256);

$m = memory_get_usage();

unset($s);

$mm = memory_get_usage();

echo $m-$mm;

输出结果如下:

释放了48个字节的内存,在说明结果之前我先带大家了解下mermory_get_usage()函数,官方的解释是:当函数的参数不设置或者设置为false时返回的是分配给当前php脚本的内存量,如果设置为true的话返回的是系统分配总的内存尺寸,包括未使用的页,那我们接着来看下当设置为true时的结果是怎样的?

$s = str_repeat('1',256);

$m = memory_get_usage(true);

unset($s);

$mm = memory_get_usage(true);

echo $m-$mm;

输出结果如下:

我们发现结果是0,那我们可以似乎可以得出一个结论是:unset掉一个变量后,当前脚本的内存量有所增加,内存被释放,但是这部分内存没有被我们的系统回收,那什么时候会被系统(OS)回收呢?

$s = str_repeat('1',2100000);

$m = memory_get_usage(true);

unset($s);

$mm = memory_get_usage(true);

echo $m-$mm;

输出结果如下:

我们发现这个结果不再是0,说明内存被系统回收了,也就是说我们unset掉的变量所占的内存大到一定程度时才会被系统回收,至于这个界限是多少,本人在不同的操作系统下运行的结果不同,可能与当前操作系统(OS)内存的大小和分配给当前脚本内存大小有关系。其实,当调用emalloc函数申请内存的时候php并不是简单的想OS要内存,而是每次申请都会OS会分配一块比较大的内存,当有申请者的时候再分配其中的一块给它。另外,在测试中我们还发现释放的内存有的时候小于我们申请的内存。

$m0 = memory_get_usage();

echo '申请前:'.$m0."\r\n";

$s = str_repeat('1',100);

$m = memory_get_usage();

echo '申请后:'.$m."\r\n";

unset($s);

$mm = memory_get_usage();

echo '释放后:'.$mm."\r\n";

输出结果如下:

再来看个例子:

$m0 = memory_get_usage();

echo '申请前:'.$m0."\r\n";

//$s = str_repeat('1',100);

$s = 'new string new string new string new string new string new string new string';

$m = memory_get_usage();

echo '申请后:'.$m."\r\n";

unset($s);

$mm = memory_get_usage();

echo '释放后:'.$mm."\r\n";

输出结果如下:

这两个例子的区别仅仅在于变量s的值一个是函数创建后再赋值的,一个是直接赋值的,第一个例子变量申请了192个字节,释放的时候只释放了160个字节,第二个例子申请前和释放后是一样的,那这是为什么呢?我们先看下php是怎么给我们分配内存的

1.为变量名分配内存,存入符号表

2.为变量值分配内存

在揭晓答案前在看两个东东,一个是例1中变量s的zval结构,一个是例2中的zval结构:

发现通过函数创建的变量s的refcount=1,而直接赋值的变量s的refount=0,说明unset掉一个变量后只释放了符号表s,s的值所占的内存并没有被释放。

好了,以上就是我对php unset()函数的总结。

php unset 多可以什么_PHP unset() 详解相关推荐

  1. PHP如何释放内存之unset销毁变量并释放内存详解

    PHP的unset()函数用来清除.销毁变量,不用的变量,我们可以用unset()将它销毁.但是某些时候,用unset()却无法达到销毁变量占用的内存!我们先看一个例子: <?php $s = ...

  2. php unset 多可以什么_php unset()销毁单个或多个变量

    php unset()销毁单个或多个变量unset函数是php自带的一个销毁变量的函数,我们介绍了利用unset来销毁静态变量与全局变量的方法,同时出可以销毁数组变量哦,下面我们看实例. 例 1. u ...

  3. php unset方法,PHP中__unset()方法详解

    __unset(),当对不可访问属性调用unset()时被调用. 看这个方法之前呢,我们也先来看一下 unset() 函数,unset()这个函数的作用是删除指定的变量且传回true,参数为要删除的变 ...

  4. php中unset函数是在哪一章_PHP unset函数原理及使用方法解析

    unset―释放给定的变量 说明 unset(mixed$var[,mixed$...] ) :void unset()销毁指定的变量. unset()在函数中的行为会依赖于想要销毁的变量的类型而有所 ...

  5. php unset()详解

    unset()经常会被用到,用于销毁指定的变量,但它有自己的行为模式,如果不仔细的话可能会被中文解释给迷惑: 先来看看官方文档的说法: unset  -- unset a given variable ...

  6. php获取总共内存_PHP获取内存使用情况详解

    本篇将详解php获取内存使用情况. PHP内置函数memory_get_usage()能返回当前分配给PHP脚本的内存量,单位是字节(byte).在WEB实际开发中,这些函数非常有用,我们可以使用它来 ...

  7. php java内存占用_PHP内存溢出优化代码详解

    相信很多人做大批量数据导出和数据导入的时候,经常会遇到PHP内存溢出的问题,在解决了问题之后,总结了一些经验,整理成文章记录下. 优化点 1.优化SQL语句,避免慢查询,合理的建立索引,查询指定的字段 ...

  8. python自动寻路算法_PHP生成迷宫及自动寻路算法详解

    如何使用PHP生成迷宫以及寻路求解?本文主要介绍了PHP生成迷宫及自动寻路算法,并对PHP生成迷宫及自动寻路算法详解.希望对大家有所帮助. 本文实例讲述了PHP树的深度编历生成迷宫及A*自动寻路算法. ...

  9. php 数组对比 unset,如何区分PHP中unset,array_splice的区别

    1.使用的函数 a.函数unset()unset ( mixed $var , mixed $... = ? ) : void unset()销毁指定的变量. b.函数array_slice()arr ...

最新文章

  1. 基于C++的OpenCV常用函数
  2. 【机器学习】随机森林原理
  3. oralce之 10046对Hash Join分析
  4. 杭十四计算机教室,杭十四中学生做了个图书馆智能机器人
  5. Android全面解析Handler
  6. linux内核网络基础,linux网络内核基础.doc
  7. Caused by: java.lang.ClassNotFoundException: javax.persistence.NamedStoredProcedureQuery
  8. linux好用的下载工具,四款linux下的好工具
  9. pm8060raid卡命令
  10. 个人网站建设基本步骤解析
  11. pbs 写matlab作业,pbs提交作业.pdf
  12. 数模转换器的构成和特点
  13. 打开HFSS出现Unable to detect installed products的报错,要求make sure that config/admin.xml exists
  14. SDP PPS SPS分析(spsparser)
  15. 论文中world自带公式编辑器编辑的公式每次打开公式自动加粗问题解决。
  16. 天气预报API及城市代码[最详细]
  17. 训练赛1_E_Lawnmower
  18. LTE-A载波聚合技术(14)---PHICH
  19. Leaving...Hard resetting via RTS pin...
  20. 90后的年轻人喜爱社区论坛的还有吗

热门文章

  1. (18)修改 PTE 实现挂物理页读写空指针
  2. 3.APC的挂入过程
  3. 【rsyslogd】rsyslog 中 timereported 与 timegenerated 区别
  4. ACM入门之【拓扑排序】
  5. Codeforces Beta Round #9 (Div. 2 Only)【未完结】
  6. Spring boot优点
  7. 记一次使用 Lombok 翻车造成的事故!
  8. 2020年7月程序员工资统计,平均14357元,又跌了,扎心
  9. struts2教程(4)--类型转换
  10. 蓝桥杯java第八届第四题--魔方状态