PHP 8 连接 MySQL 握手失败主因是 TLS 协商失败或 caching_sha2_password 认证插件不兼容;需验证 mysqlnd 版本 ≥8.0.0、启用 openssl 扩展,或降级认证插件(ALTER USER…IDENTIFIED WITH mysql_native_password)或配置 SSL 证书路径并确保权限正确。

PHP 8 连接 MySQL 数据库时出现握手失败,常见于连接刚建立就中断、报错 SSL handshake failed 或 Authentication plugin 'caching_sha2_password' cannot be loaded,本质是 TLS 协商或认证插件不兼容导致的底层连接中止,不是代码语法错误。
确认 PHP 是否真正支持 caching_sha2_password
仅看 php -v 显示 8.0+ 不够——必须验证实际加载的 mysqlnd 驱动版本和编译特性:
运行 php -i | grep "mysqlnd",输出中必须含 【mysqlnd 8.0.0 or later】(注意不是“mysqlnd version”那一行,而是“Client API version”或“mysqlnd enabled”段落);若显示 7.x 或无此字样,说明你用的是旧版编译驱动,即使 PHP 是 8.2 也无效。
再执行 php -m | grep openssl,确保 openssl 扩展已启用;缺失则无法解密 SHA2 握手包,【caching_sha2_password 认证必然失败】。
立即学习“PHP免费学习笔记(深入)”;
强制降级认证插件(快速生效)
方法一:登录 MySQL 服务端,为应用用户重置认证方式
执行:ALTER USER 'your_app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
注意:'%' 要与 PHP 连接时指定的 host 一致(如用 127.0.0.1 连接,则写 'your_app_user'@'127.0.0.1');执行后必须 FLUSH PRIVILEGES;。
方法二:新建兼容用户(推荐用于生产环境隔离)
在 MySQL 中运行:CREATE USER 'app_v8_legacy'@'%' IDENTIFIED WITH mysql_native_password BY 'strong_pass_2026'; GRANT SELECT,INSERT,UPDATE ON your_db.* TO 'app_v8_legacy'@'%'; FLUSH PRIVILEGES;
然后 PHP 配置中把 username 改为 app_v8_legacy,即可绕过 SHA2 插件限制。
启用并正确配置 SSL 连接
第一步:确认 MySQL 服务端已加载有效 CA 证书
登录 MySQL 执行 SHOW VARIABLES LIKE 'ssl_ca';,拿到路径后,在服务器上运行 openssl x509 -in /path/to/ca.pem -text -noout;若报 unable to load certificate,说明证书损坏或路径错误,需重新部署。
第二步:PHP 客户端加载证书(PDO 方式)
在 PDO DSN 中添加参数:mysql:host=localhost;dbname=test;sslmode=REQUIRED;sslca=/etc/mysql/ssl/ca.pem;
注意:sslca 值必须是 绝对路径,且 PHP 进程用户(如 www-data)对该文件有读权限;相对路径或 URL 一律无效。
第三步:命令行验证连通性(排除 PHP 环境干扰)
运行:mysql -u app_user -p --ssl-mode=VERIFY_CA --ssl-ca=/etc/mysql/ssl/ca.pem -h your-db-host;若此处失败,说明证书链或网络配置仍有问题,PHP 层无需再调。



















