如何配置PHP8.1数据库连接以解决MySQL连接失败问题?

2026-05-07 15:111阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1155个文字,预计阅读时间需要5分钟。

如何配置PHP8.1数据库连接以解决MySQL连接失败问题?

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.10.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_socketpdo_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 路径、防火墙策略这四者之间存在隐式耦合。改一处,得同步核对其他三处,不然永远在循环排查。

标签:MysqlPHPPHP8

本文共计1155个文字,预计阅读时间需要5分钟。

如何配置PHP8.1数据库连接以解决MySQL连接失败问题?

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.10.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_socketpdo_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 路径、防火墙策略这四者之间存在隐式耦合。改一处,得同步核对其他三处,不然永远在循环排查。

标签:MysqlPHPPHP8