我遇到了可怕的错误消息,可能通过艰苦的努力,PHP内存不足:
在第123行的file.php中,####字节的允许内存大小耗尽(尝试分配####字节)
如果您知道自己在做什么并希望增加限制,请参阅memory_limit:
ini_set('memory_limit', '16M');
ini_set('memory_limit', -1); // no limit
Run Code Online (Sandbox Code Playgroud)
谨防!你可能只是解决症状而不是问题!
错误消息指向一条带有循环的行,我认为该循环正在泄漏或不必要地累积内存.我memory_get_usage()在每次迭代结束时打印语句,可以看到数字慢慢增长,直到达到极限:
foreach ($users as $user) {
$task = new Task;
$task->run($user);
unset($task); // Free the variable in an attempt to recover memory
print memory_get_usage(true); // increases over time
}
Run Code Online (Sandbox Code Playgroud)
对于这个问题的目的,让我们假设最坏的面条代码可以想象在全球范围内的某处藏匿在$user或Task.
什么工具,PHP技巧或调试巫毒可以帮助我找到并解决问题?
我的专用服务器有32GB内存,内存不断上升,我现在必须每天重新启动它.这给我的客户和金钱带来了损失.
我很难找到内存泄漏的位置.我在网上找到的只是人们说"使用xdebug",但我找不到任何关于查找内存泄漏的xdebug教程.我曾尝试在函数调用之前和之后打印memory_get_usage,但这是正确的方法吗?
我有很多PHP脚本运行 - 一些来自访问者,另一些来自cron作业 - 我需要找到哪一个正在泄漏内存并尽快修复它但我甚至不知道如何确定给定的功能是否是泄漏记忆与否.
我已经尝试在函数调用之前和之后打印memory_get_usage,然后它会上升,但是如果我不止一次调用该函数,它就不再上升了.有人可以解释一下,并告诉我如何简单轻松地判断PHP函数是否有内存泄漏?