2015-07-13 148 views
1

因爲我知道這個解決方案。PHP內存耗盡

ini_set('memory_limit','-1'); 

如果即使這還不夠。

問題是我正在使用循環並創建並銷燬循環中使用的變量。但是我還沒有找到背後的確切原因。每次循環執行後的內存利用率都會增加。我的循環將運行將近2000到10000次。所以即使4GB的內存也不夠用。

正如我所觀察到的,使用top通常情況下,內存在循環開始時使用50mb,一旦循環繼續,每次迭代後增加10到15mb的大小。所以我的代碼沒有完全執行。

ini_set('memory_limit', '-1'); 
      ini_set('xdebug.max_nesting_level', 1000); 
      $ex_data = some data; 
      $config = some data; 
      $docConf = some data; 
      $codeNameIndex = some data; 
      $originalName = some data; 
      CONST LIMIT = 3000; 
      CONST START = 1000; 

    //till here it is using 55 to 6o mb memory 
      for ($i = self::START; $i < (self::START + self::LIMIT); $i++) { 
          $start_memory = memory_get_usage(); 
          $object = new ImportProjectController(); 
          $object->ex_data = $ex_data; 
          $object->config = $config; 
          $object->docConf = $docConf; 
          $StratProInsertDateTime = microtime(true); 
          try { 
           DB::connection()->getPdo()->beginTransaction(); 
           $object->ex_data[$codeNameIndex[2]][$codeNameIndex[1]] = $originalName . '_' . $i; 
           $object->ex_data[$codeCodeIndex[2]][$codeCodeIndex[1]] = $originalCode . '_' . $i; 
           if (!$object->insert_project()) { 
            throw new Exception('error while inserting project'); 
           } 
           if (!$object->insert_documents()) { 
            throw new Exception('error while inserting documents'); 
           } 
           App::make('AccessController')->rebuildCache(); 
           DB::connection()->getPdo()->commit(); 
          } catch (Exception $ex) { 
           DB::connection()->getPdo()->rollBack(); 
           echo $ex; 
          } 
//it is increasing memory utilization every iteration. 
       echo "Memory used for inserting a ".$i."th project :- "; 
       echo memory_get_usage() - $start_memory.PHP_EOL; 
       unset($object->ex_data); 
       unset($object->config); 
       unset($object->docConf); 
       $object = null; 
       echo "Memory utilization before inserting project :- "; 
       echo memory_get_usage() - $start_memory.PHP_EOL; 
      } 
  • $對象 - > insert_project()
  • $對象 - > insert_documents()
  • 應用::讓( 'AccessController的') - > rebuildCache()

方法做一些數據庫插入。

因爲我在循環結束時取消設置$ object變量。但仍然沒有釋放內存。我相信在上述方法中沒有佔用內存的東西。

Swap:  0k total,  0k used,  0k free, 241560k cached 

    PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND                     
27671 ec2-user 20 0 1489m 1.1g 9908 R 66.0 30.4 8:15.00 php                      
4307 mysql  20 0 852m 140m 5576 S 18.2 3.7 14:21.50 mysqld  

以上是最常見的輸出輸出,因爲您可以清楚地看到內存利用率達到1.1gb。它正在增加..

Plz讓我知道是否需要更多的描述。

+0

您應該更深入地檢查循環中執行的方法內存泄漏。同時在這裏實例化控制器並調用它們的方法是應用程序設計不好的標誌,因此您可能需要重新考慮應用程序結構(例如通過將邏輯提取到另一層來重構控制器方法)。 – Bogdan

+0

親愛的博格,Aoove腳本是測試腳本。我寫了上面的腳本來上傳大量的數據。並通過打開不同的頁面來測試我的網站。所以我會在生活中運行這個腳本一次。所以我只想運行一次。 –

回答

0

我從我的同事那裏得到了這個問題的答案。

Laravel執行查詢日誌記錄,並且所有查詢都將其保存在內存中,這就是爲什麼我得到這樣的問題。使用下面的代碼,我的腳本運行良好,僅使用了250MB的內存。希望這會對其他人有所幫助。

DB::disableQueryLog();