使用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个小时又达不到内存溢出的要求,所以这个方法不能测试出是不是断线重连导致的溢出。
排查一圈无果,想问问有没有人遇到过和我类似的问题。

阅读 4.1k
2 个回答

可能的其他原因:

  1. 排查下是不是数据库查询有很大的结果集?
  2. 脚本中是不是大量使用了静态变量?

PHP内存管理的锅
像PHP-FPM这种有个机制,子进程接收多少次请求就退出进程就是为了解决这个。
关键原因是某些扩展的内存溢出了。短时间内可能没多少,可能几个KB,但是时间长了就不行了。
个人建议是配合pm2或者docker实现内存管理,超过限定内存直接强制重启

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题