为了账号安全,请及时绑定邮箱和手机立即绑定

诊断内存泄漏 - 允许#bytes的内存大小耗尽

诊断内存泄漏 - 允许#bytes的内存大小耗尽

PHP
侃侃无极 2019-08-16 14:35:20
诊断内存泄漏 - 允许#bytes的内存大小耗尽我遇到了可怕的错误消息,可能通过艰苦的努力,PHP内存不足:在第123行的file.php中,####字节的允许内存大小耗尽(尝试分配####字节)增加限制如果您知道自己在做什么并希望增加限制,请参阅memory_limit:ini_set('memory_limit', '16M');ini_set('memory_limit', -1); // no limit谨防!你可能只是解决症状而不是问题!诊断泄漏:错误消息指向一条带有循环的行,我认为该循环正在泄漏或不必要地累积内存。我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}对于这个问题的目的,让我们假设最坏的面条代码可以想象在全球范围内的某处藏匿在$user或Task。什么工具,PHP技巧或调试巫毒可以帮助我找到并解决问题?
查看完整描述

3 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

php中有几个可能的内存泄漏点:

  • php本身

  • php扩展

  • 你使用的PHP库

  • 你的PHP代码

没有深度逆向工程或php源代码知识,很难找到并修复前3个。对于最后一个,您可以使用二进制搜索内存泄漏代码和memory_get_usage


查看完整回答
反对 回复 2019-08-16
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

这是我们用来确定哪些脚本在我们的服务器上使用最多内存的技巧。

将以下代码段保存在文件中,例如/usr/local/lib/php/strangecode_log_memory_usage.inc.php

<?phpfunction strangecode_log_memory_usage(){
    $site = '' == getenv('SERVER_NAME') ? getenv('SCRIPT_FILENAME') : getenv('SERVER_NAME');
    $url = $_SERVER['PHP_SELF'];
    $current = memory_get_usage();
    $peak = memory_get_peak_usage();
    error_log("$site current: $current peak: $peak $url\n", 3, '/var/log/httpd/php_memory_log');}register_shutdown_function('strangecode_log_memory_usage');

通过在httpd.conf中添加以下内容来使用它:

php_admin_value auto_prepend_file /usr/local/lib/php/strangecode_log_memory_usage.inc.php

然后分析日志文件 /var/log/httpd/php_memory_log

您可能需要touch /var/log/httpd/php_memory_log && chmod 666 /var/log/httpd/php_memory_log在Web用户可以写入日志文件之前。


查看完整回答
反对 回复 2019-08-16
  • 3 回答
  • 0 关注
  • 443 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信