php unset 多可以什么_PHP unset() 详解
我們對unset() 這個(gè)函數(shù)的作用的了解大概就是它可以銷毀一個(gè)變量,釋放內(nèi)存,這種理解并沒有錯(cuò),可能就是不夠深入,接下來我通過幾個(gè)例子向大家展示下unset一個(gè)變量后真正發(fā)生的一些事情。以下的代碼是在linux+php7.1環(huán)境下運(yùn)行
$s = str_repeat('1',256);
$m = memory_get_usage();
unset($s);
$mm = memory_get_usage();
echo $m-$mm;
輸出結(jié)果如下:
釋放了48個(gè)字節(jié)的內(nèi)存,在說明結(jié)果之前我先帶大家了解下mermory_get_usage()函數(shù),官方的解釋是:當(dāng)函數(shù)的參數(shù)不設(shè)置或者設(shè)置為false時(shí)返回的是分配給當(dāng)前php腳本的內(nèi)存量,如果設(shè)置為true的話返回的是系統(tǒng)分配總的內(nèi)存尺寸,包括未使用的頁,那我們接著來看下當(dāng)設(shè)置為true時(shí)的結(jié)果是怎樣的?
$s = str_repeat('1',256);
$m = memory_get_usage(true);
unset($s);
$mm = memory_get_usage(true);
echo $m-$mm;
輸出結(jié)果如下:
我們發(fā)現(xiàn)結(jié)果是0,那我們可以似乎可以得出一個(gè)結(jié)論是:unset掉一個(gè)變量后,當(dāng)前腳本的內(nèi)存量有所增加,內(nèi)存被釋放,但是這部分內(nèi)存沒有被我們的系統(tǒng)回收,那什么時(shí)候會被系統(tǒng)(OS)回收呢?
$s = str_repeat('1',2100000);
$m = memory_get_usage(true);
unset($s);
$mm = memory_get_usage(true);
echo $m-$mm;
輸出結(jié)果如下:
我們發(fā)現(xiàn)這個(gè)結(jié)果不再是0,說明內(nèi)存被系統(tǒng)回收了,也就是說我們unset掉的變量所占的內(nèi)存大到一定程度時(shí)才會被系統(tǒng)回收,至于這個(gè)界限是多少,本人在不同的操作系統(tǒng)下運(yùn)行的結(jié)果不同,可能與當(dāng)前操作系統(tǒng)(OS)內(nèi)存的大小和分配給當(dāng)前腳本內(nèi)存大小有關(guān)系。其實(shí),當(dāng)調(diào)用emalloc函數(shù)申請內(nèi)存的時(shí)候php并不是簡單的想OS要內(nèi)存,而是每次申請都會OS會分配一塊比較大的內(nèi)存,當(dāng)有申請者的時(shí)候再分配其中的一塊給它。另外,在測試中我們還發(fā)現(xiàn)釋放的內(nèi)存有的時(shí)候小于我們申請的內(nèi)存。
$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";
輸出結(jié)果如下:
再來看個(gè)例子:
$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";
輸出結(jié)果如下:
這兩個(gè)例子的區(qū)別僅僅在于變量s的值一個(gè)是函數(shù)創(chuàng)建后再賦值的,一個(gè)是直接賦值的,第一個(gè)例子變量申請了192個(gè)字節(jié),釋放的時(shí)候只釋放了160個(gè)字節(jié),第二個(gè)例子申請前和釋放后是一樣的,那這是為什么呢?我們先看下php是怎么給我們分配內(nèi)存的
1.為變量名分配內(nèi)存,存入符號表
2.為變量值分配內(nèi)存
在揭曉答案前在看兩個(gè)東東,一個(gè)是例1中變量s的zval結(jié)構(gòu),一個(gè)是例2中的zval結(jié)構(gòu):
發(fā)現(xiàn)通過函數(shù)創(chuàng)建的變量s的refcount=1,而直接賦值的變量s的refount=0,說明unset掉一個(gè)變量后只釋放了符號表s,s的值所占的內(nèi)存并沒有被釋放。
好了,以上就是我對php unset()函數(shù)的總結(jié)。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的php unset 多可以什么_PHP unset() 详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell去掉字符两端字符_Shell脚
- 下一篇: 怎样呵护友谊_怎样呵护友谊(作文)