php mysql 连接池解决方案
传统的 php 项目在高并发场景下有一个痛点:没有 mysql 连接池。
在没有连接池的情况下,大量的短连接会占用端口,请求完成之后会, 连接也不会立马释放,会有一个 TIME_WAIT 的状态, 导致请求数据库失败。
在 java 或者 go 相关项目中都不会有这样的问题,因为他们都带有连接池,php 项目解决这个问题只能依赖 workman 或者 swoole 这样的框架才能实现,或者采用长连接的方式。
基于 workman 或者 swoole 这样的框架都需要对原来的代码进行改造,成本较高,而且他们都是每个进程有一个连接池。
我用 go 语言写了一个 mysql 代理服务, 服务启动后通过 unix domain socket 与 php 进行通信,这样不占用端口,也不需要真正的经过网络协议栈,有更高的通信效率。
- php 第一次请求代理服务时,代理服务新建 mysql 的连接
- php 通过代理服务与 mysql 进行认证,认证通过后保存认证相关的数据包
- php 通过代理服务发送指令,获取响应结果,当 php 使用完成发送 close 指令时,代理服务把 mysql 连接放入连接池,等待下次请求使用。
- php 第二次请求代理,代理从连接池取出连接,与 php 进行假的认证,然后代理后面的指令请求和响应完成请求。
整个流程不需要 php 修改代码,只需要把连接 mysql 的方式改成 unix socket 的方式即可。
本帖已被设为精华帖!
本帖由系统于 2年前 自动加精
赞~
是不是跟smproxy有点类似?它是swoole写的
牛逼
大佬!膜拜一下