分析
近日开发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