我在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
答案 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中的函数始终是全局的,这意味着它将一直存在到脚本结束。这就是为什么每次调用它时,它都会分配一些内存,永远不会释放它。
你应该只创建一次函数,或者我确定你可以使用回调重写整个函数来摆脱内存泄漏。