PHP短连接访问MySQL每一次PHP发起连接MySQL都要完整走一遍TCP三次握手查询完毕执行四次挥手关闭TCP连接。短连接流程PHP进程 → 三次握手建立TCP通道 → MySQL账号密码认证 → 执行SQL → 拿到结果 → 关闭连接四次挥手销毁TCP通道1. 是不是每次SQL查询都三次握手是的。短连接的定义就是用完就拆TCP管道。哪怕你PHP脚本里连续执行2条SELECT只要是两次new PDO新建连接就会两次握手、两次挥手。补充同一个PDO实例同一次请求内多次执行SQL不会反复握手复用当前TCP连接脚本执行结束PHP-FPM销毁这个连接。PHP-FPM短连接经典场景每来一个Web请求新建MySQL连接请求结束连接关闭。2. 有哪些性能问题① 每次多一轮RTT网络耗时握手开销三次握手需要1.5个往返RTT。如果MySQL不在本机跨服务器访问RTT如果是10ms光是握手就要额外花十几毫秒。频繁请求场景下大量时间不是耗在SQL执行而是反复建连、断连。用快递类比每查一次数据库都要重新搭建一次快递通道查完直接拆掉。频繁查询就不停建通道、拆通道大量时间浪费在路上。② TCP断开带来大量TIME_WAIT状态高频坑连接关闭时主动关闭一方这里一般是PHP客户端会进入TIME_WAIT要等待2MSL时间才释放端口。高并发业务大量短连接快速创建销毁会瞬间堆积大量TIME_WAIT套接字。耗尽客户端可用端口内核维护大量连接记录占用CPU和内存严重时PHP无法新建MySQL连接报Cannot connect to MySQL③ MySQL服务端连接创建开销MySQL收到新连接要做账号密码校验、权限加载、初始化会话变量、事务上下文。新建MySQL连接本身有CPU开销大量瞬间涌入的短连接MySQL要不停创建、销毁会话CPU压力上涨。MySQL有最大连接数max_connections大量并发短连接瞬间打满这个上限直接拒绝新连接。④ PHP侧资源反复创建销毁每次新建PDO对象内核要分配文件描述符关闭就释放。频繁创建销毁带来系统调用开销。3. 解决方案PHP开发常用连接池推荐Swoole/Hyperf提前建立一批TCP长连接连接复用不再每次查询握手。连接池把建好的TCP通道缓存起来脚本用完不关闭交给下一个请求复用。PHP-FPM持久连接 pdo_persistentPHP-FPM进程保留MySQL长连接进程不销毁连接保留。注意持久连接有坑容易残留事务、锁、会话变量污染后续请求。本机MySQLlocalhost用unix socket不走TCP协议不需要三次握手直接内核通道消除TCP握手开销。缺点不能跨机器访问。4. 一句话总结PHP短连接访问MySQL每次新建连接必然执行TCP三次握手并发高的时候反复建连断连会带来网络延迟、大量TIME_WAIT、MySQL连接数打满、额外CPU开销。连接池就是用来解决这个痛点。