使用tp5结合workerman搭建聊天室;正常运行约24小时后,命令行报错提示内存溢出,请问这是哪里出了问题?

发布于 2022-09-07 23:10:38 字数 880 浏览 31 评论 0

问题描述:
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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

死开点丶别碍眼 2022-09-14 23:10:38

可能的其他原因:

  1. 排查下是不是数据库查询有很大的结果集?
  2. 脚本中是不是大量使用了静态变量?
故笙诉离歌 2022-09-14 23:10:38

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文