2012-12-09 119 views
1

如果我在我的電腦爲什麼get_memory_usage保留內存?

echo memory_get_usage(); 
echo "|"; 
echo memory_get_usage(); 
echo "|"; 
echo memory_get_usage(); 

上運行下面的PHP程序我得到的輸出

635048|635080|635080 

由此看來,似乎memory_get_usage初始呼叫保留的內存32KB。我想這沒有echo聲明

echo memory_get_usage(); 
echo memory_get_usage(); 
echo memory_get_usage(); 

,並得到了類似的結果

634504634536634536 
//broken out 634504, 634536, 634536 

在去除echo報表降低腳本的總體內存使用情況,有初始呼叫後仍然滯留在32KB到memory_get_usage。爲什麼是這樣?

我試過多臺電腦,雖然實際數字不同,但差距仍然相同。

如果我看(我認爲是)這個函數

//File: php-5.3.19/ext/standard/var.c 
PHP_FUNCTION(memory_get_usage) { 
    zend_bool real_usage = 0; 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &real_usage) == FAILURE) { 
     RETURN_FALSE; 
    } 

    RETURN_LONG(zend_memory_usage(real_usage TSRMLS_CC)); 
} 

的來源我不認爲有什麼看不一定說「在內存中保留這個變量」。不過,我多年來都沒有認真寫過C,而且我從未專業地攻擊過PHP源代碼,並且我的追蹤執行能力也沒有。

所以,我的問題是,什麼保留了32KB的內存,以及PHP源代碼中發生了什麼,以及/或者我如何從memory_get_usage入口點跟蹤它。

+1

初始輸出緩衝,也許?如果你在第一個措施之前回應了什麼會發生什麼? – Charles

+0

這就是它@Charles - 如果你喜歡,我會迴應/接受。 –

回答

1

這可能是必須創建輸出的結果。也許有一些輸出緩衝涉及?

在命令提示:

[[email protected] /tmp]$ php --version 
PHP 5.4.9 (cli) (built: Nov 22 2012 12:59:04) 
Copyright (c) 1997-2012 The PHP Group 
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies 
    with Xdebug v2.2.0rc1, Copyright (c) 2002-2012, by Derick Rethans 
[[email protected] /tmp]$ cat test.php 
<?php 
#echo '|'; 
echo memory_get_usage(); 
echo '|'; 
echo memory_get_usage(); 
echo '|'; 
echo memory_get_usage(); 
echo '|'; 

[[email protected] /tmp]$ php test.php 
227024|227056|227056| 

當test.php的被修改第一測量前回聲,我們得到

[[email protected] /tmp]$ cat test.php 
<?php 
echo '|'; 
echo memory_get_usage(); 
echo '|'; 
echo memory_get_usage(); 
echo '|'; 
echo memory_get_usage(); 
echo '|'; 

[[email protected] /tmp]$ php test.php 
|227192|227192|227192|