2014-03-18 99 views
0

我在我的類上創建了一個方法來獲取並存儲所需的SQL語句中的所有結果,並且它工作得很好。現在,在生產一些個月後,我遇到了這個錯誤:mysql_free_result()中的內存耗盡

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 3503272 bytes) in C:\xxpathxx\class.DGC_Gerais.php on line 0 

正如我開始檢查,我跟蹤誤差爲mysql_free_result(),但在評論這條線,它仍然doenst工作。

這裏的_fetch方法:

PUBLIC static function _fetch($sql){ 
     $q = mysql_query($sql); 

     if(mysql_num_rows($q) > 0): 

      for($a=0 ; $linha = mysql_fetch_row($q) ; $a++){ // forEach row. 
       foreach($linha as $chave => $valor): // forEach field. 
        $result[$a][$chave] = $valor; 
       endforeach; 

      } 

//   mysql_free_result($q); 

      return $result; 

     else: 
      return false; 
     endif; 

    } 
+0

如果你的數據集對於你的內存來說太多了,你可能會考慮使用分頁。 –

回答

1
  1. 該代碼是非常令人費解,並可以簡化爲:

    public static function _fetch($sql) { 
        $q = mysql_query($sql); 
    
        if (mysql_num_rows($q) == 0) { 
         return false; 
        } 
    
        $result = array(); 
        while ($linha = mysql_fetch_row($q)) { 
         $result[] = $linha; 
        } 
        return $result; 
    } 
    

    是否沒有雙迴路完全相同。

  2. 問題是,您正在從數據庫中提取所有數據並將其存儲在$result中,這意味着它需要存儲在內存中。而PHP默認情況下限制了腳本可用的內存量,所以你只是超過了這個限制。 mysql_free_result與此沒有任何關係。首先嚐試提取較少的數據,或者處理該循環內部的數據,而不需要將所有內容都存儲在數組中。

    如果這沒有幫助,請仔細調高內存限制ini_set('memory_limit', $limit)

+0

你說錯綜複雜的話是什麼意思?太'髒'? – Leandragem

+0

1)提前失敗,最後不要使用'return..hse'作爲'if..else'。 2)如果沒有結果行,'$ result'永遠不會被定義,'return $ result'會觸發一個錯誤。那麼,在你的情況下,你有'返回false',但這是一個典型的錯誤,不初始化數組。 3)循環將數組的每個鍵和值分配給另一個數組是毫無意義的,只是按原樣分配數組。 4)用'$ a'手動記錄數字索引是多餘的,這就是'$ result [] ='的意思。 – deceze

+0

你的答案有幫助,但我不認爲它是這樣,因爲在這種特殊情況下,它處理了450行,然後耗盡,但我已經從同一個表中處理了2000多行,沒有任何問題或警告。 – Leandragem