问题背景:
基于workerman开发服务过程中发生内存泄漏,首先想说明的是,workerman框架本身非常稳定,不存在内存泄漏。workerman内存回收机制完全遵循PHP原有的GC机制。在workerman里业务代码都是在函数或者类方法里运行的,根据PHP的回收机制,函数或者类方法里临时变量会自动回收,所以开发时基本不用考虑内存回收问题,也不会有内存泄漏,不需要手动unset,但是下面的 "问题原因" 是必备注意事项。
可能原因:
1、业务代码有内存泄漏,比如使用了全局变量数组或者类的某个属性是数组,数组中的元素个数一直在净增加,导致内存占用越来越大。
这个场景又可以细分为:
(1)global
关键字的全局变量,并且变量是数组
(不是数组不用关心)
(2)static
关键字的类的静态变量,并且变量是数组
(不是数组不用关心)
(3)给$worker对象
临时赋值
的属性,比如 $worker->uidlist 这个属性是数组(不是数组不用关心)
2、使用了不稳定的或者有BUG的第三方PHP类库,类库里面同样因为问题1导致内存不断增大。
3、使用了不稳定的或者有BUG的第三方PHP扩展,这些扩展在使用过程中导致内存会不断增大。
4、业务传输数据量很大,但是客户端接收很慢,导致数据积压在内存。例如向1000人广播一个1M大小的数据包,那么最差的情况,服务器内存瞬间增加1G。这种情况可能要适当增加PHP内存限制【/path/to/php.ini中的memory_limit】,并且优化业务,避免广播巨大的数据包。
5、定时器
也是用一个类的静态数组存储的,所以如果无限增加定时器又从不删除,也会导致内存泄漏。
版权属于:大卫科技Blog
本文链接:https://www.iyuu.cn/archives/203/
转载时须注明出处