我目前有一個使用Zend Framework的PHP CLI腳本,它似乎在運行時使用了更多的內存。它循環遍歷從數據庫中檢索的大批模型(批量爲1000)。調用memory_get_usage()
表明腳本的內存使用量始終在增加。有沒有辦法以字節爲單位獲得PHP變量的大小?
儘管確保我在每次迭代之後都不再設置模型,並且實際使用array_shift()
來減少每次迭代中模型陣列的大小。
我的問題是,在PHP中有一種方法發現變量的內存大小,所以我可以跟蹤什麼在增長?
我目前有一個使用Zend Framework的PHP CLI腳本,它似乎在運行時使用了更多的內存。它循環遍歷從數據庫中檢索的大批模型(批量爲1000)。調用memory_get_usage()
表明腳本的內存使用量始終在增加。有沒有辦法以字節爲單位獲得PHP變量的大小?
儘管確保我在每次迭代之後都不再設置模型,並且實際使用array_shift()
來減少每次迭代中模型陣列的大小。
我的問題是,在PHP中有一種方法發現變量的內存大小,所以我可以跟蹤什麼在增長?
我沒有一個解決方案,以檢查每一個變量的大小,但如果使用doctrine其可能的原因
你需要使用
$Elem->free(true);
另一件事是升級到5.3 (如果你不這樣做),5.3的garbage collector更好
我們沒有使用原則,而是在5.3上運行了大量改進的東西,特別是在每批次1000後運行gc_collect_cycles()。謝謝。 – EntityDigital 2010-11-03 10:54:55
這裏是一個代碼段我在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;
}
?>
發現它得到以字節爲單位給定的陣列的大小。這是你的意思嗎?
這將返回數組中字符串的總長度,它沒有說明數組的字節大小。如果我使用的是多字節字符集,則此函數將錯誤地報告 – 2010-11-03 10:14:19
您是對的,但大多數情況下,您將不會使用多字節字符集,並且因爲它用於調試目的,所以它可以提供幫助。 – 2010-11-03 10:18:26
查看原始問題,OP正在檢索一大組模型項目,因此它可能是一個對象數組而非字符串。這個功能可能適用於長時間的情況,但我不確定它適用於此。 – 2010-11-03 10:22:23
不,你可能在尋找沒有釋放的內存,例如您取消了一個變量的鏈接或刪除了一個引用,並且garbage collector尚未釋放內存中的關聯塊。
您可以嘗試Zend Server 5(儘管您需要商業版本)來存儲您的應用程序。它有code tracing。我不知道這是否會讓你發現內存泄漏。
另見:
我不知道它是多麼準確,但我用了apc_add('variable_name', $var);
一些。然後我在我的apc.php
用戶緩存條目下查看大小列。
當然,對於這項工作,您需要安裝並運行APC。 :-)
有一個[重複](http://stackoverflow.com/questions/1075419/how-to-find-memory-used-by-an-object-in-php-sizeof)但我是不滿意那裏接受的答案(雖然解決方案可能是唯一的方法),所以不投票關閉和+1 – 2010-11-03 10:10:40
這是我一直在努力的一個問題。可以使用xDebug來分析應用程序,但它沒有提及內存使用情況。在某些時候沒有調用memory_get_usage,我從來沒有找到解決方案。 – 2010-11-03 10:18:01
我確實有重複搜索,但我所得到的是一頁充滿內存不足的錯誤,雖然我的壞。我接受這個特定答案的原因是,它基本上證實了我們剛剛發現的內容,沒有發現變量大小的真正方法,至少部分原因是咀嚼記憶是因爲垃圾收集不好。但我明白你的觀點。 – EntityDigital 2010-11-03 11:33:23