php在守護程序中,記憶體洩露用unset()解決辦法
阿新 • • 發佈:2019-02-19
PHP的unset()
函式用來清除、銷燬變數,不用的變數,我們可以用unset()
將它銷燬。但是某些時候,用unset()
卻無法達到銷燬變數佔用的記憶體!我們先看一個例子:
<?php
$s=str_repeat('1',255); //產生由255個1組成的字串
$m=memory_get_usage(); //獲取當前佔用記憶體
unset($s);
$mm=memory_get_usage(); //unset()後再檢視當前佔用記憶體
echo $m-$mm;
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
最後輸出unset()
之前佔用記憶體減去unset()
之後佔用記憶體,如果是正數,那麼說明unset($s)
$s
從記憶體中銷燬(或者說,unset()
之後記憶體佔用減少了),可是我在PHP5
和windows
平臺下,得到的結果是:-48
。這是否可以說明,unset($s)
並沒有起
到銷燬變數$s
所佔用記憶體的作用呢?我們再作下面的例子:
<?php
$s=str_repeat('1',256); //產生由256個1組成的字串
$m=memory_get_usage(); //獲取當前佔用記憶體
unset($s);
$mm=memory_get_usage(); //unset()後再檢視當前佔用記憶體
echo $m-$mm;
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
這個例子,和上面的例子幾乎相同,唯一的不同是,$s
由256個1組成,即比第一個例子多了一個1,得到結果是:224
。這是否可以說明,unset($s)
已經將$s
所佔用的記憶體銷燬了?
通過上面兩個例子,我們可以得出以下結論:結論一、unset()
函式只能在變數值佔用記憶體空間超過256位元組時才會釋放記憶體空間。
那麼是不是隻要變數值超過256,使用unset
就可以釋放記憶體空間呢?我們再通過一個例子來測試一下:
<?php
$s=str_repeat('1',256); //這和第二個例子完全相同
$p=&$s;
$m=memory_get_usage();
unset ($s); //銷燬$s
$mm=memory_get_usage();
echo $p.'<br />';
echo $m-$mm;
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
重新整理頁面,我們看到第一行有256個1,第二行是-48
,按理說我們已經銷燬了$s
,而$p
只是引用$s
的變數,應該是沒有內容了,另外,unset($s)
後記憶體佔用卻比unset()前增加了!現在我們再做以下的例子:
<?php
$s=str_repeat('1',256); //這和第二個例子完全相同
$p=&$s;
$m=memory_get_usage();
$s=null; //設定$s為null
$mm=memory_get_usage();
echo $p.'<br />';
echo $m-$mm;
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
現在重新整理頁面,我們看到,輸出$p
已經是沒有內容了,unset()
前後記憶體佔用量之差是224
,即已經清除了變數佔用的記憶體。本例中的$s=null
也可以換成unset()
,如下:
<?php
$s=str_repeat('1',256); //這和第二個例子完全相同
$p=&$s;
$m=memory_get_usage();
unset($s); //銷燬$s
unset($p);
$mm=memory_get_usage();
echo $p.'<br />';
echo $m-$mm;
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
我們將$s
和$p
都使用unset()
銷燬,這時再看記憶體佔用量之差也是224,說明這樣也可以釋放記憶體。那麼,我們可以得到另外一條結論:結論二、只有當指向該變數的所有變數(如引用變數)都被銷燬後,才會釋放記憶體。
相信經過本文的例子後,大家應該對unset()
有所瞭解了,最起碼,本人用unset()
也是為了在變數不起作用時,釋放記憶體。