PHP的内存泄漏及解决方法

内存泄漏指的是在程序运行过程中申请了内存,但是在使用完成后没有及时释放的现象,
对于普通运行时间较短的程序来说可能问题不会那么明显,但是对于长时间运行的程序,
比如Web服务器,后台进程等就比较明显了,随着系统运行占用的内存会持续上升, 可能会因为占用内存过高而崩溃,或被系统杀掉(OOM)。

PHP的内存泄漏
PHP属于高级语言,语言级别并没有内存的概念,在使用过程中完全不需要主动申请或释放内存, 所以在PHP用户代码级别也就不存在内存泄漏的概念了。

1.泄漏原因:
一是是没有及时释放大变量
二就是第三方扩展本身实现存在问题
三是php-fpm造成的内存泄漏(有人说过。但博主没遇见过,在此不细说)。

2.处理方式:
一般来说,未释放变量是常见的泄漏原因,也容易改正;扩展本身存在的问题需要用心用时排查一下(特别是用了别人写的插件,当你的环境与插件推荐环境不符合时)。

内存泄漏的debug及工具
内存泄漏的程序通常很容易发现,因为症状都表现为内存占用的持续增长, 在发现内存持续增长后我们需要判断是什么导致了内存泄漏,这时往往需要借助一些工具来帮助追查,我们可以用到两个工具:PHP内置内存泄漏探测及valgrind内存泄漏分析。

PHP本身有自己的内存管理,在编译时,增加编译选项–enable-debug 以及相应扩展编译时加上 ./configure --enable-debug,这样编译后,使用命令行执行php ***.php 如果有内存泄漏则会打印错误信息。(注意:这个方法只能检测到使用了Zend内存管理的情况,对于直接使用malloc/free来申请内存的应用或扩展是无法检测到的。)
valgrind 工具介绍和简单的使用:https://www.cnblogs.com/AndyStudy/p/6409287.html

3.内存泄漏的预防:
1.写高质量代码,减少内存泄漏的可能:代码中的大数组、大变量用完及时清除。
2.根据PHP生命周期回收,让系统自动回收内存(对于非常驻行程序有效,RINIT ,RSHOTDOWN)
3.手动回收,即重启服务器nginx或apache (MINIT ,MSHOTDOWN)
4.调高php.ini配置文件: php.ini memory_limit = 128M(不推荐)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值