2010-11-03 57 views
13

我目前有一個使用Zend Framework的PHP CLI腳本,它似乎在運行時使用了更多的內存。它循環遍歷從數據庫中檢索的大批模型(批量爲1000)。調用memory_get_usage()表明腳本的內存使用量始終在增加。有沒有辦法以字節爲單位獲得PHP變量的大小?

儘管確保我在每次迭代之後都不再設置模型,並且實際使用array_shift()來減少每次迭代中模型陣列的大小。

我的問題是,在PHP中有一種方法發現變量的內存大小,所以我可以跟蹤什麼在增長?

+0

有一個[重複](http://stackoverflow.com/questions/1075419/how-to-find-memory-used-by-an-object-in-php-sizeof)但我是不滿意那裏接受的答案(雖然解決方案可能是唯一的方法),所以不投票關閉和+1 – 2010-11-03 10:10:40

+0

這是我一直在努力的一個問題。可以使用xDebug來分析應用程序,但它沒有提及內存使用情況。在某些時候沒有調用memory_get_usage,我從來沒有找到解決方案。 – 2010-11-03 10:18:01

+0

我確實有重複搜索,但我所得到的是一頁充滿內存不足的錯誤,雖然我的壞。我接受這個特定答案的原因是,它基本上證實了我們剛剛發現的內容,沒有發現變量大小的真正方法,至少部分原因是咀嚼記憶是因爲垃圾收集不好。但我明白你的觀點。 – EntityDigital 2010-11-03 11:33:23

回答

3

我沒有一個解決方案,以檢查每一個變量的大小,但如果使用doctrine其可能的原因

你需要使用

$Elem->free(true); 

另一件事是升級到5.3 (如果你不這樣做),5.3的garbage collector更好

+0

我們沒有使用原則,而是在5.3上運行了大量改進的東西,特別是在每批次1000後運行gc_collect_cycles()。謝謝。 – EntityDigital 2010-11-03 10:54:55

-2

這裏是一個代碼段我在weberdev

<?php 
function array_size($a){ 
    $size = 0; 
    while(list($k, $v) = each($a)){ 
     $size += is_array($v) ? array_size($v) : strlen($v); 
    } 
    return $size; 
} 
?> 

發現它得到以字節爲單位給定的陣列的大小。這是你的意思嗎?

+3

這將返回數組中字符串的總長度,它沒有說明數組的字節大小。如果我使用的是多字節字符集,則此函數將錯誤地報告 – 2010-11-03 10:14:19

+0

您是對的,但大多數情況下,您將不會使用多字節字符集,並且因爲它用於調試目的,所以它可以提供幫助。 – 2010-11-03 10:18:26

+1

查看原始問題,OP正在檢索一大組模型項目,因此它可能是一個對象數組而非字符串。這個功能可能適用於長時間的情況,但我不確定它適用於此。 – 2010-11-03 10:22:23

0

我不知道它是多麼準確,但我用了apc_add('variable_name', $var);一些。然後我在我的apc.php用戶緩存條目下查看大小列。

當然,對於這項工作,您需要安裝並運行APC。 :-)

相關問題