2012-04-24 302 views
1

我總是看到一個內存耗盡錯誤PHP致命錯誤:268435456個字節允許內存大小耗盡

PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted

在我的日誌文件。

即使當服務器非常輕載&在本地主機上不可重現時,此錯誤也會隨機出現。我有一個來自hostgator的VPS 4服務器,負載爲MB。 PHP配置允許高達256 Mb。

的代碼如下

function func_select_array($qry) 
{ 
    $i=0; 
    $data=array(); 
    $qry_result=mysql_query($qry); 

    if($qry_result) 
    { 
     while ($row=mysql_fetch_assoc($qry_result)) 
     { 
      $data[$i] = $row; 
      $i++; 
     } 
     return $data; 
    } 
    else 
    { 
     return 2; 
    } 
} 


    function func_check_rule_out_bid($auc_id,$bid_amount,$return_freq,$recheck) 
    { 
     $bid_qry="select * from tbl_bid where ubaid='".$auc_id."' and ubf='1' order by uba desc limit 0,10"; 
     $bid_array=func_select_array($bid_qry); 
    } 

表tbl_bid有2800條記錄。 我在func_select_array函數內的while循環中得到內存耗盡錯誤。 我無法想象這個查詢需要256M +。它似乎不是一個PHP的問題,但在MySQL中的東西。請幫助...

+0

你到底在哪一行發生錯誤。並放心,是有關PHP,而不是MySQL。如果它是mysql,那麼服務器不會返回結果。但是你應該驗證你是否發送了正確的查詢。 – hakre 2012-04-24 19:48:57

+0

2800記錄可能是確定的。每個記錄的大小是多少?他們是否包含「BLOB」? – 2012-04-24 19:51:20

+0

業務的第一順序是重新創建錯誤。如果沒有,記錄一切。如果可能的話,在內存用完之前記錄查詢,'mysql_num_rows()','memory_get_peak_usage()'的結果和其他任何內容。然後,下次發生這種情況時,您可以查看它試圖迭代的查詢和記錄數量。你可能會發現一些你通常不會期望的東西。 – 2012-04-24 20:22:47

回答

0

您應該使用EXPLAIN來查詢。爲了確保你不會做一些沉重的查詢(起初看起來似乎沒有)。

第二種方式,可能是你得到一些太重的BLOB或TEXT字段。不在你的地方,這就是爲什麼你無法在當地環境得到這個。

確保您沒有收到無限循環。可能?

使用trace php錯誤並嘗試/​​捕獲此塊以獲取有關錯誤的更好信息。

try { 
     while ($row=mysql_fetch_assoc($qry_result)) 
     { 
      $data[$i] = $row; 
      $i++; 
     } 

} catch (Exception $e) { 
    debug_print_backtrace(); 
    var_dump($e->getMessage()); 
} 
+0

你好。查詢並不大。該表有11列(5個整數,4個varchar(255),1個datetime和1個double)。我不認爲我進入了無限循環,因爲這是查詢大部分時間都很好。內存錯誤隨機出現。同樣在調用函數中,我將行數限制爲10.因此,無論表中的記錄數是多少,如果只有10行被迭代,那麼如何解決問題呢?你能告訴我我怎麼能試着抓住並記錄哪個查詢導致內存錯誤? – Anita 2012-04-25 18:46:57

+0

除了你可以打印你的查詢,看看是否沒有什麼奇怪的東西在某個地方。 – ontananza 2012-04-25 21:27:41

1

內存耗盡是非常困難的調試,因爲錯誤只告訴你哪裏的記憶終於耗盡了,不要在那裏用它的大部分。

您可以使用內存分析器(例如Xdebug中的內存分析器)來查找所有內存的位置。

相關問題