使用tp5结合workerman搭建聊天室;正常运行约24小时后,命令行报错提示内存溢出,请问这是哪里出了问题?
问题描述:
workerman启动正常,并且客户端可以正常收发消息;但是长时间连接后就会出现内存溢出的现象。
在这之前还遇到过一个问题是workerman正常运行8小时后,会报Error while sending QUERY packet PID=xxxx
的错误,在排查之后发现是tp5的数据库缓存机制,8小时后会自动断开连接。在数据库配置文件配置允许断线重连后这个问题解决了,接下来就出现了刚刚描述的错误。
错误信息:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes) in E:\phpStudy\WWW\study\thinkphp\library\think\db\Connection.php on line 766
运行环境及框架版本:
Windows Server 2016
php 5.6.27
apache 2.4.18
mysql 5.5.53
thinkphp 5.1.0
workerman 3.5.1
尝试过的方案:
之前有想过单独从workerman的方向单独去查找原因,但是找了一圈没有人遇到过和我类似的错误;
一开始以为是连接数过多导致内存溢出,但是我测试过同时600个客户端连接都没有导致崩溃(这个程序用户高峰期差不多就这个数);然后又检查过是不是因为用户断开连接后没有做释放内存的操作,发现用户断开后其标识符是被释放掉了的。
遂想要从tp5的方向查找,我想知道是不是因为数据库配置允许了断线重连,长时间连接导致内存溢出。但是不允许断线重连的话8个小时又达不到内存溢出的要求,所以这个方法不能测试出是不是断线重连导致的溢出。
排查一圈无果,想问问有没有人遇到过和我类似的问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
可能的其他原因:
PHP内存管理的锅
像PHP-FPM这种有个机制,子进程接收多少次请求就退出进程就是为了解决这个。
关键原因是某些扩展的内存溢出了。短时间内可能没多少,可能几个KB,但是时间长了就不行了。
个人建议是配合pm2或者docker实现内存管理,超过限定内存直接强制重启