2012-04-28 61 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

相关问题