2012-04-28 66 views
2

我在PHP中有一個長時間的運行操作,並且它總是崩潰,內存不足。爲什麼這個php函數泄漏內存

,所以我開始記錄MEM使用方式:

 $result = memory_get_usage()/1024; 
     echo $result; 

通過註釋的部分代碼,我發現了「有罪」之一,負責吃了我所有的公羊。

這是代碼:

 static private function from_camel_case($str) 
     { 
      $str[0] = strtolower($str[0]); 
      $func = create_function('$c', 'return "_" . strtolower($c[1]);'); 
      $result = preg_replace_callback('/([A-Z])/', $func, $str); 
      return $result; 
     } 

它基本上將文本轉換首字母大寫的用下劃線小寫。

這是爲什麼泄漏?

我在我的Mac OS上運行PHP 5.3.5爲毫安X Lion中

+0

您可以使用'preg_replace'用'_'作爲前綴加上字母,然後將'strtolower'應用於整個字符串。它會阻止使用回調和創建功能 – zerkms 2012-04-28 11:57:47

+0

它不是**泄漏內存,你只是不知道內存在哪裏使用。看到答案。 – salathe 2012-04-28 12:00:29

回答

3

您每次調用它時都會使用create_function創建一個函數。 PHP中的函數總是全局的,這意味着它會一直存在直到腳本結束。這就是爲什麼每次調用它時,它都會分配一些內存並且不會釋放它。

您應該只創建一次函數,或者我確定您可以使用回調來重寫整個事物以擺脫內存泄漏。

+0

確實!那就是問題所在。謝謝!仍然需要等待8分鐘才能接受這個答案,雖然:( – 2012-04-28 12:00:06

3

如果你一遍又一遍地調用代碼問題又來了是這一行:

$func = create_function('$c', 'return "_" . strtolower($c[1]);');

那代碼會在您每次調用它時創建一個新的匿名函數。根據http://www.php.net/create_function將代碼放入全局名稱空間,因此該方法完成時不會刪除該函數。

4

因爲你是creating a new function every time that function runs

由於您使用的5.3,你可以用匿名函數替換create_function,看看是否有幫助:

static private function from_camel_case($str) 
    { 
     $str[0] = strtolower($str[0]); 
     $result = preg_replace_callback('/([A-Z])/', function($matches) { 
      return '_' . strtolower($matches[1]); 
     }, $str); 
     return $result; 
    } 

或提取回調到正常的功能:

static private function from_camel_case($str) 
    { 
     $str[0] = strtolower($str[0]); 
     $result = preg_replace_callback('/([A-Z])/', array(__CLASS__, 'replace_case'), $str); 
     return $result; 
    } 

    static private function replace_case($matches) { 
     return '_' . strtolower($matches[1]); 
    } 
+0

你忘了刪除舊的'create_function'電話。 – 2012-04-28 12:06:03

+0

哦,我的,那很愚蠢,謝謝! – DCoder 2012-04-28 12:07:30

相關問題