为什么这个php函数会泄漏内存

时间:2012-04-28 11:53:07

标签: php php-5.3

我在PHP中有一个长时间运行的操作,它总是因内存不足而崩溃。

所以我开始使用以下方式记录mem使用情况:

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

通过评论部分代码,我发现了#34;有罪"一,负责吃掉我所有的公羊。

这是代码:

        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;
        }

它基本上将camelcase中的文本转换为带有下划线的小写。

为什么会泄漏?

我在Mac OS X Lion上在MAMP中运行PHP 5.3.5

3 个答案:

答案 0 :(得分: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]);
    }

答案 1 :(得分:3)

如果你一遍又一遍地调用那段代码,问题就出在这一行:

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

每次调用它时,该代码都会创建一个新的匿名函数。根据{{​​3}},代码被放入全局命名空间,因此在方法完成时不会删除该函数。

答案 2 :(得分:3)

每次调用时,都使用create_function创建一个函数。 PHP中的函数始终是全局的,这意味着它将一直存在到脚本结束。这就是为什么每次调用它时,它都会分配一些内存,永远不会释放它。

你应该只创建一次函数,或者我确定你可以使用回调重写整个函数来摆脱内存泄漏。