2010-03-09 20 views
5

我正在做一個基準類來顯示頁面加載時間和內存使用情況。 加載時間已經工作,但是當我顯示內存使用,它不會改變 例子:memory_get_usage

$conns = array(); 
ob_start(); 
benchmark::start(); 
$conns[] = mysql_connect('localhost', 'root', ''); 
benchmark::stop(); 
ob_flush(); 

使用相同的內存

$conns = array(); 
ob_start(); 
benchmark::start(); 
for($i = 0; $i < 1000; $i++) 
{ 
    $conns[] = mysql_connect('localhost', 'root', ''); 
} 
benchmark::stop(); 
ob_flush(); 

我使用memory_get_usage(真)以字節爲單位獲取內存使用量。

+2

雖然每個mysql_connect()都會返回一個有效句柄,但它只是第一個的副本,因爲沒有任何更改。 – 2010-03-09 14:27:58

回答

2

我不是PHP的內部大師,但我可以想象一個echo不會影響PHP使用的內存量,因爲它只是向客戶端輸出內容。

如果啓用輸出緩衝,則可能會有所不同。

下應該有所作爲:

$result = null; 
benchmark::start() 
for($i = 0; $i < 10000; $i++) 
{ 
    $result.='test'; 
} 
+0

我已經做了一些關於PHP內存管理的調查,而且,它確實會隨着時間而改變。添加簡單變量似乎會導致內存逐步增加(預分配?)。要查看大跳躍,請在比較之前和之後進行比較。 – symcbean 2010-03-09 14:18:49

0

回聲不會改變的字節分配數(除非你用output buffers)。

$ i變量在for循環之後未被設置,所以它也不會改變分配的字節數。

嘗試使用輸出緩衝例如:

ob_start(); 
benchmark::start(); 
for($i = 0; $i < 10000; $i++) 
{ 
    echo 'test'; 
} 
benchmark::stop(); 
ob_flush(); 
+0

ob_start(); benchmark :: start(); $ conns [] = mysql_connect('localhost','root',''); } benchmark :: stop(); ob_flush(); 我仍然得到相同的內存使用... – Qtacz 2010-03-09 14:10:53

8

memory_get_usage(true)將顯示由PHP引擎分配的內存量,而不是實際使用的腳本。你的測試腳本很可能不需要引擎要求更多的內存。

對於測試,抓住一個大的(ish)文件並將其讀入內存。那麼你應該看到一個變化。

我已經成功地使用memory_get_usage(true)來跟蹤網絡抓取腳本的內存使用情況,並且它工作正常(因爲目標是在達到系統內存限制之前減慢速度)。需要記住的一點是,它不會根據實際使用情況進行更改,它會根據引擎請求的內存進行更改。 所以你最終看到的是突然跳躍,而不是放緩增長(或縮小)。

如果您設置real_usage標誌設置爲false,你可以看到內存非常小的變化 - 但是,這不會幫助您監控存儲PHP的真正量從系統請求。

更新:要清楚我描述的差別是腳本,相比引擎請求運行腳本所有相同的腳本內存的變量,不同的方式使用的內存之間。 。在

+0

我不同意。該文檔說:「返回目前正在分配給您的PHP **腳本**的內存量,以字節爲單位。」 – 2010-03-09 14:41:35

+1

@henchman,您錯過了這一點,確定它是全部相同的腳本,但沒有將real_usage設置爲true它報告你的'代碼'使用的內存,real_usage設置爲true它會報告系統請求的內存以運行你的'代碼'。 – 2010-03-09 14:51:05

+1

@henchman來自docs的引用:「將此設置爲TRUE以獲取從系統**分配的內存**的實際大小。如果未設置或FALSE,則僅報告emalloc()使用的**內存**。 :-) – 2010-03-09 15:08:24

2

的測量)外觀:

for($i = 0; $i < 1000; $i++) 
{ 
    $conns[] = mysql_connect('localhost', 'root', ''); 
} 

你本來可以循環100,000和什麼事都不會發生變化,其相同的連接。沒有資源分配給它,因爲記住它們的鏈表永遠不會增長。它爲什麼會增長?已有(假設)有效句柄$conns[0]。它在memory_get_usage()中不會有所作爲。你測試了$conns[15]看看它是否有效,是嗎?

root @ localhost可以有多個密碼嗎?不。爲什麼PHP會因爲你告訴它而煩惱處理另一個連接? (舌頭)。

我建議通過Valgrind運行通過CLI同樣的事情,看看實際的堆使用情況:

valgrind /usr/bin/php -f foo.php ..或者類似的東西。在底部,你會看到什麼是分配的,什麼是在工作中被釋放和垃圾收集。免責聲明:我知道我的PHP內部解決方案,但我並不是那種用C語言編寫的故意混淆迷宮的專家,Zend稱它爲PHP。

相關問題