PHP的
unset()
函數用來清除、銷毀變量,不用的變量,我們可以用
unset()
将它銷毀。但是某些時候,用
unset()
卻無法達到銷毀變量占用的記憶體!我們先看一個例子:
<?php
$s=str_repeat('1',); //産生由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個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',); //這和第二個例子完全相同
$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',); //這和第二個例子完全相同
$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',); //這和第二個例子完全相同
$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()
也是為了在變量不起作用時,釋放記憶體。