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年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5
黑将军

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

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

大佬!膜拜一下

2年前 评论

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