PHP unset() 详解
<p>我们对unset() 这个函数的作用的了解大概就是它可以销毁一个变量,释放内存,这种理解并没有错,可能就是不够深入,接下来我通过几个例子向大家展示下unset一个变量后真正发生的一些事情。以下的代码是在linux+php7.1环境下运行</p><div class="cnblogs_Highlighter">
<pre class="brush:php;gutter:true;">$s = str_repeat('1',256);
$m = memory_get_usage();
unset($s);
$mm = memory_get_usage();
echo $m-$mm;</pre>
</div>
<p> 输出结果如下:</p>
<p> <img src="https://img2018.cnblogs.com/common/1503034/202001/1503034-20200114135103390-1230862629.png"> </p>
<p>释放了48个字节的内存,在说明结果之前我先带大家了解下<span style="background-color: rgba(255, 0, 255, 1)"><span style="color: rgba(255, 255, 255, 1)">mermory_get_usage()</span> </span>函数,官方的解释是:<strong>当函数的参数不设置或者设置为false时返回的是分配给当前php脚本的内存量,如果设置为true的话返回的是系统分配总的内存尺寸</strong>,<strong>包括未使用的页</strong>,那我们接着来看下当设置为true时的结果是怎样的?</p>
<div class="cnblogs_Highlighter">
<pre class="brush:php;gutter:true;">$s = str_repeat('1',256);
$m = memory_get_usage(true);
unset($s);
$mm = memory_get_usage(true);
echo $m-$mm;</pre>
</div>
<p>输出结果如下:</p>
<p><img src="https://img2018.cnblogs.com/common/1503034/202001/1503034-20200114140233307-1285615616.png"></p>
<p>我们发现结果是0,那我们可以似乎可以得出一个结论是:unset掉一个变量后,当前脚本的内存量有所增加,内存被释放,但是这部分内存没有被我们的系统回收,那什么时候会被系统(OS)回收呢?</p>
<div class="cnblogs_Highlighter">
<pre class="brush:php;gutter:true;"><?php
$s = str_repeat('1',2100000);
$m = memory_get_usage(true);
unset($s);
$mm = memory_get_usage(true);
echo $m-$mm;
</pre>
</div>
<p>输出结果如下:</p>
<p><img src="https://img2018.cnblogs.com/common/1503034/202001/1503034-20200114145234788-1799832094.png"></p>
<p><span style="font-size: 14px">我们发现这个结果不再是0,说明内存被系统回收了,也就是说我们unset掉的变量所占的内存大到一定程度时才会被系统回收,至于这个界限是多少,本人在不同的操作系统下运行的结果不同,</span><span style="font-size: 14px">可能与当前操作系统(OS)内存的大小和分配给当前脚本内存大小有关系。</span><span style="font-size: 14px"><strong>其实,当调用emalloc函数申请内存的时候php并不是简单的想OS要内存,而是每次申请都会OS会分配一块比较大的内存,当有申请者的时候再分配其中的一块给它</strong></span>。<span style="font-size: 14px">另外,在测试中我们还发现释放的内存有的时候小于我们申请的内存。</span><em id="__mceDel"><em id="__mceDel"> </em></em></p>
<div class="cnblogs_Highlighter">
<pre class="brush:php;gutter:true;"><?php
$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";</pre>
</div>
<p>输出结果如下:</p>
<p><img src="https://img2018.cnblogs.com/common/1503034/202001/1503034-20200114161944330-782127660.png"></p>
<p>再来看个例子:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:php;gutter:true;"><?php
$m0 = memory_get_usage();
echo '申请前:'.$m0."\r\n";
//$s = str_repeat('1',100);<br>$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";</pre>
</div>
<p> 输出结果如下:</p>
<p> <img src="https://img2018.cnblogs.com/common/1503034/202001/1503034-20200115134120642-1162232799.png"></p>
<p>这两个例子的区别仅仅在于变量s的值一个是函数创建后再赋值的,一个是直接赋值的,第一个例子变量申请了192个字节,释放的时候只释放了160个字节,第二个例子申请前和释放后是一样的,那这是为什么呢?我们先看下php是怎么给我们分配内存的</p>
<p><strong>1.为变量名分配内存,存入符号表</strong></p>
<p><strong>2.为变量值分配内存</strong></p>
<p>在揭晓答案前在看两个东东,一个是例1中变量s的zval结构,一个是例2中的zval结构:</p>
<p><img src="https://img2018.cnblogs.com/common/1503034/202001/1503034-20200115142136574-1628225422.png"></p>
<p><img src="https://img2018.cnblogs.com/common/1503034/202001/1503034-20200115142253452-1492864665.png"></p>
<p>发现通过函数创建的变量s的refcount=1,而直接赋值的变量s的refount=0,说明unset掉一个变量后只释放了符号表s,s的值所占的内存并没有被释放。</p>
<p>好了,以上就是我对php unset()函数的总结。</p><br><br>
来源:https://www.cnblogs.com/shuzhen2020/p/12192721.html
頁:
[1]