如何配置PHP8.1数据库连接以解决MySQL连接失败问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1155个文字,预计阅读时间需要5分钟。
Connection refused - 错误不是密码错了,也不是代码写漏了分号,而是PHP基本没接触到MySQL——服务没开、端口没监听,或者是连接地址错了。先确认这一层通不通,再查权限和认证。
mysqli_connect() 报 Connection refused 怎么快速定位
这个错误意味着 TCP 连接被系统直接拒绝,mysqli_connect() 甚至没发出去第一个握手包。别急着改密码或重装扩展。
- 运行
sudo systemctl status mysql,看输出是不是active (running);如果不是,先sudo systemctl start mysql - 运行
ss -tlnp | grep :3306,确认有 mysqld 进程在监听3306端口;如果没输出,说明 MySQL 没绑定端口,去检查/etc/mysql/mysql.conf.d/mysqld.cnf里的bind-address(设为127.0.0.1或0.0.0.0,别留空或写成localhost) - PHP 代码里别硬写
"localhost"——它在 Linux/macOS 上默认走 Unix socket,而 socket 路径可能不一致;换成"127.0.0.1"强制走 TCP,更可控 - Docker 场景下,
localhost指的是 PHP 容器自己,不是宿主机;用host.docker.internal(Docker Desktop)或宿主机真实 IP(Linux Docker)
PHP8.1 连 MySQL 8.0+ 提示 authentication plugin 错误
MySQL 8.0 默认用 caching_sha2_password 认证插件,但 PHP 8.1 的 mysqli 扩展(尤其旧版本)默认不支持,会报类似 The server requested authentication method unknown to the client。
- 最稳妥的解法是在 MySQL 侧改用户认证方式:
ALTER USER 'your_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 执行完必须跟一句
FLUSH PRIVILEGES;,否则不生效 - 别全局改 MySQL 配置文件里的
default_authentication_plugin——会影响其他客户端,且新版 MySQL 不鼓励这么做 - 如果必须保留
caching_sha2_password,就得确保 PHP 编译时启用了 OpenSSL 支持,并升级到较新版本的 mysqli(PHP 8.1.10+ 更稳定)
扩展没启用或 socket 路径不一致导致连接失败
即使服务开着、认证也对,mysqli.default_socket 和 MySQL 实际 socket 路径不一致,也会让 "localhost" 连接静默失败(尤其 Ubuntu 系统上常见)。
立即学习“PHP免费学习笔记(深入)”;
- 查 MySQL 的 socket 路径:
mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';",通常返回/var/run/mysqld/mysqld.sock - 查 PHP 配置:
php -i | grep mysqli.default_socket,对比是否一致;不一致就改/etc/php/8.1/fpm/php.ini(FPM)或/etc/php/8.1/cli/php.ini(CLI)里的mysqli.default_socket和pdo_mysql.default_socket - 改完重启服务:
sudo systemctl restart php8.1-fpm mysql - 验证扩展是否加载:
php -m | grep -i mysqli,没输出说明扩展根本没启用;Ubuntu 上装命令是sudo apt install php8.1-mysql
云服务器或防火墙拦住 3306 端口
本地能连,服务器上连不上?大概率是中间网络设备把包丢了,而不是 PHP 或 MySQL 配置问题。
- 云服务器(阿里云、腾讯云等)必须进控制台配安全组规则:入方向放行
TCP:3306,来源不能只填127.0.0.1,得填 PHP 所在机器的公网 IP 或0.0.0.0/0(测试用) - Linux 主机上检查防火墙:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS),确认3306/tcp在允许列表里 - SELinux 启用时也可能拦截:
sudo setenforce 0临时关闭测试;若确认是它,需用semanage port -a -t mysqld_port_t -p tcp 3306开放端口 - 别信“我关了防火墙”,用
telnet your-server-ip 3306从 PHP 所在机器直连测试——通了才说明网络层没问题
真正卡住人的地方,往往不是某一行代码写错了,而是 MySQL 监听地址、PHP 解析 host 的方式、socket 路径、防火墙策略这四者之间存在隐式耦合。改一处,得同步核对其他三处,不然永远在循环排查。
本文共计1155个文字,预计阅读时间需要5分钟。
Connection refused - 错误不是密码错了,也不是代码写漏了分号,而是PHP基本没接触到MySQL——服务没开、端口没监听,或者是连接地址错了。先确认这一层通不通,再查权限和认证。
mysqli_connect() 报 Connection refused 怎么快速定位
这个错误意味着 TCP 连接被系统直接拒绝,mysqli_connect() 甚至没发出去第一个握手包。别急着改密码或重装扩展。
- 运行
sudo systemctl status mysql,看输出是不是active (running);如果不是,先sudo systemctl start mysql - 运行
ss -tlnp | grep :3306,确认有 mysqld 进程在监听3306端口;如果没输出,说明 MySQL 没绑定端口,去检查/etc/mysql/mysql.conf.d/mysqld.cnf里的bind-address(设为127.0.0.1或0.0.0.0,别留空或写成localhost) - PHP 代码里别硬写
"localhost"——它在 Linux/macOS 上默认走 Unix socket,而 socket 路径可能不一致;换成"127.0.0.1"强制走 TCP,更可控 - Docker 场景下,
localhost指的是 PHP 容器自己,不是宿主机;用host.docker.internal(Docker Desktop)或宿主机真实 IP(Linux Docker)
PHP8.1 连 MySQL 8.0+ 提示 authentication plugin 错误
MySQL 8.0 默认用 caching_sha2_password 认证插件,但 PHP 8.1 的 mysqli 扩展(尤其旧版本)默认不支持,会报类似 The server requested authentication method unknown to the client。
- 最稳妥的解法是在 MySQL 侧改用户认证方式:
ALTER USER 'your_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 执行完必须跟一句
FLUSH PRIVILEGES;,否则不生效 - 别全局改 MySQL 配置文件里的
default_authentication_plugin——会影响其他客户端,且新版 MySQL 不鼓励这么做 - 如果必须保留
caching_sha2_password,就得确保 PHP 编译时启用了 OpenSSL 支持,并升级到较新版本的 mysqli(PHP 8.1.10+ 更稳定)
扩展没启用或 socket 路径不一致导致连接失败
即使服务开着、认证也对,mysqli.default_socket 和 MySQL 实际 socket 路径不一致,也会让 "localhost" 连接静默失败(尤其 Ubuntu 系统上常见)。
立即学习“PHP免费学习笔记(深入)”;
- 查 MySQL 的 socket 路径:
mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';",通常返回/var/run/mysqld/mysqld.sock - 查 PHP 配置:
php -i | grep mysqli.default_socket,对比是否一致;不一致就改/etc/php/8.1/fpm/php.ini(FPM)或/etc/php/8.1/cli/php.ini(CLI)里的mysqli.default_socket和pdo_mysql.default_socket - 改完重启服务:
sudo systemctl restart php8.1-fpm mysql - 验证扩展是否加载:
php -m | grep -i mysqli,没输出说明扩展根本没启用;Ubuntu 上装命令是sudo apt install php8.1-mysql
云服务器或防火墙拦住 3306 端口
本地能连,服务器上连不上?大概率是中间网络设备把包丢了,而不是 PHP 或 MySQL 配置问题。
- 云服务器(阿里云、腾讯云等)必须进控制台配安全组规则:入方向放行
TCP:3306,来源不能只填127.0.0.1,得填 PHP 所在机器的公网 IP 或0.0.0.0/0(测试用) - Linux 主机上检查防火墙:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS),确认3306/tcp在允许列表里 - SELinux 启用时也可能拦截:
sudo setenforce 0临时关闭测试;若确认是它,需用semanage port -a -t mysqld_port_t -p tcp 3306开放端口 - 别信“我关了防火墙”,用
telnet your-server-ip 3306从 PHP 所在机器直连测试——通了才说明网络层没问题
真正卡住人的地方,往往不是某一行代码写错了,而是 MySQL 监听地址、PHP 解析 host 的方式、socket 路径、防火墙策略这四者之间存在隐式耦合。改一处,得同步核对其他三处,不然永远在循环排查。

