2012-12-12 48 views
3

我的服務器上,我有以下錯誤:允許的內存大小已經用盡;但memory_get_peak_usage說,否則

Allowed memory size of 268435456 bytes exhausted

這發生在一個循環(一個foreach一個),當我檢查的循環與內存使用情況

memory_get_peak_usage(); 

我得到7254128這是遠遠沒有枯竭的268435456

我在多個地方檢查過,內存使用量沒有大幅增加,所以我真的不知道問題出在哪裏!

同樣的腳本工作我的本地計算機上就好了,我設置好的內存限制爲僅16Mphp.ini文件

這裏是代碼引起的問題,但我認爲它不會是真的有用,它是從question2answer開源。平臺的插件:

foreach ($badges as $slug => $info) { 
    $badge_name=qa_badge_name($slug); 
    if(!qa_opt('badge_'.$slug.'_name')) 
      qa_opt('badge_'.$slug.'_name',$badge_name); 
    $name = qa_opt('badge_'.$slug.'_name'); 
} 
+0

所以....可能是'qa_opt'或'qa_badge_slug'的一些遞歸失敗? – Wrikken

+0

我把它放在帖子中,但我不認爲它是有用的,它來自插件,所以語法是特定的。而且我知道代碼不乾淨,它不是我的代碼,但我試圖讓它工作! – darkheir

+0

@Wrikken它可能發生在foreach?因爲循環的第一圈表現良好,但第二圈則出現錯誤。 它在我的本地計算機上工作,這添加了一些奇怪! – darkheir

回答

1

我強烈懷疑你的問題會由於標準的MySQL連接器庫中的「錯誤功能」。當從數據庫中獲取包含「長塊」或「長文本」字段的行時。 MySQL庫不是分配數據所需的確切大小,而是試圖分配可能需要存儲該行的最大大小。即4千兆字節的存儲器。

解決這個問題的最簡單方法是切換到使用不具有這種 '功能'

PHP massive memory usage for SQL query

Allowed memory size of 67108864 bytes exhausted

I'm checking the memory usage in the loop with memory_get_peak_usage(); I obtain 7254128 which is far from the 268435456 exhausted!

這是正確的MySQL的ND連接器。內存分配失敗,所以峯值內存使用量不會像使用中那樣顯示巨大的分配。

btw您應該已經能夠跟蹤錯誤消息到生成失敗的內存分配錯誤的確切代碼行。如果它不是源自SQL提取,那麼答案可能是錯誤的。

相關問題