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 的方式即可。

项目地址: github.com/lyuangg/umyproxy

本帖已被设为精华帖!
本帖由系统于 2年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 5
黑将军

是不是跟smproxy有点类似?它是swoole写的

2年前 评论
yuancoder (楼主) 2年前

大佬!膜拜一下

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!