ubuntu下php8连接mysql超时本质是空闲连接被服务端主动断开,需同步调整mysql的wait_timeout与interactive_timeout(如设为86400秒),并在php层通过mysqli->ping()保活或缩短php-fpm进程生命周期(如pm.max_requests=500)来协同解决。

Ubuntu下PHP8连接MySQL超时,本质是“连接建立成功但后续操作失败”或“空闲后被服务端主动断开”,不是连不上服务。重点不在重装或换驱动,而在同步调整服务端空闲策略和客户端保活逻辑。
检查并统一 MySQL 的 wait_timeout 和 interactive_timeout
这是最常见也最易被忽略的根源。MySQL 默认 8 小时(28800 秒)断开空闲连接,而 PHP-FPM 进程常驻内存,连接可能长时间闲置,一用就报 Communications link failure。
- 编辑 MySQL 配置文件:/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu 20.04+ 常用路径),在
[mysqld]段下添加:
wait_timeout = 86400 interactive_timeout = 86400
86400 秒 = 24 小时,兼顾稳定性与资源释放;不建议设为 0 或过大值。
- 保存后重启 MySQL:
sudo systemctl restart mysql - 验证是否生效:登录 MySQL 执行
SHOW VARIABLES LIKE 'wait_timeout';和SHOW VARIABLES LIKE 'interactive_timeout';,确认两者数值一致且已更新
在 PHP8 中显式启用连接保活(ping 检测)
即使服务端超时调长,网络中间设备(如 NAT、负载均衡器)仍可能切断空闲连接。PHP 层需主动探测连接有效性。
- 使用 PDO 时,在每次执行查询前加
$pdo->ping()(注意:PHP 8.1+ 的 PDO 默认不支持 ping 方法,需用 mysqli 或升级到支持该方法的扩展;更稳妥的是改用 mysqli 并启用异常模式) - 推荐做法(mysqli + 异常模式):
$mysqli = new mysqli();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$mysqli->options(MYSQLI_OPT_READ_TIMEOUT, 10);
$mysqli->options(MYSQLI_OPT_WRITE_TIMEOUT, 10);
<p>if ($mysqli->connect_error) {
throw new RuntimeException('MySQL 连接失败: ' . $mysqli->connect_error);
}</p><p>// 启用异常报告,便于统一处理
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);</p><p>// 每次查询前检测连接
if (!$mysqli->ping()) {
// 连接已断,尝试重连(或抛出异常触发上层重试)
$mysqli->real_connect('127.0.0.1', 'user', 'pass', 'db', 3306);
}</p>
调整 PHP-FPM 进程生命周期,避免连接长期滞留
PHP-FPM 的 worker 进程默认长期存活,其持有的 MySQL 连接也跟着“躺平”。可缩短进程寿命,让连接自然重建。
- 编辑 PHP-FPM 池配置(如 /etc/php/8.x/fpm/pool.d/www.conf)
- 设置以下参数(示例值,按实际负载调整):
pm.max_requests = 500 # 每个子进程处理 500 个请求后重启 pm.process_idle_timeout = 10s # 空闲 10 秒后关闭子进程(仅适用于 ondemand 或 dynamic 模式)
- 重启服务:
sudo systemctl restart php8.x-fpm
排查其他干扰因素
超时问题有时是表象,背后可能是权限、路径或扩展缺失:
- 确认已安装 PHP8 MySQL 扩展:
sudo apt install php8.x-mysql(x 替换为你的小版本号,如 2、3) - 检查 MySQL 用户是否允许从
localhost或127.0.0.1连接(二者在 Unix socket 和 TCP 上行为不同):SELECT User, Host FROM mysql.user WHERE User = 'your_user'; - 若用
localhost连接却失败,尝试改用127.0.0.1,强制走 TCP 而非 socket,排除套接字路径不匹配问题 - 查看错误号而非错误文字:PDO 报错中的 [2002](Connection refused)、[2013](Lost connection)或 [HY000] 对应不同层级问题,优先查清错误号再动手
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











