天天看點

unset 銷毀變量時釋放記憶體嗎

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()

也是為了在變量不起作用時,釋放記憶體。