swoole等多进程下的 mysql has gone away 解决方案

在开发swoole等PHP多进程应用时遇到'mysql has gone away'错误,问题源于数据库连接共用。解决办法是在swoole的worker_start中或fork后为每个进程单独创建数据库连接,避免数据错乱和进程间连接共享导致的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分析

近日开发swoole等PHP多进程网络应用,发现常有发生 mysql has gone away 的错误,多方排查无果,增加长连接也无果,深度排查发现是数据库连接共用的问题。

项目下的数据库连接是在fork前统一创建传递的,也就是共用该连接,多进程如果共用1个连接,那么返回的结果无法保证被哪个进程处理。持有连接的进程理论上都可以对这个连接进行读写,这样数据就发生错乱了。

一个进程对连接的关闭,也造成了其他进程对该连接的丢失,导致了玄学的 mysql has gone away错误。

这是一个多进程下非常容易导致且严重的低级错误,应当防范

解决

swoole在worker_start中为每个进程创建数据库连接

$serv = new swoole_server("0.0.0.0", 9502);

//必须在onWorkerStart回调中创建redis/mysql连接
$serv->on('workerstart', fun
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值