php升级后数据库连接失败,主因是mysql扩展被移除及配置变更;需启用mysqli/pdo_mysql扩展、重写连接代码、调整socket/tls设置、校验php.ini中mysql相关参数。

PHP版本升级后数据库连接失败,通常是因为新版本PHP移除了旧版中默认启用的扩展(如mysql扩展),或更改了配置参数的默认值。以下是针对此问题的多种排查与修复方法:
一、检查并启用正确的数据库扩展
PHP 7.0 及以上版本已完全移除 mysql_* 函数和 mysql 扩展,仅支持 mysqli 和 pdo_mysql 扩展。若代码仍调用 mysql_connect() 等函数,将直接报错;即使使用 mysqli,若扩展未启用,也会导致连接失败。
1、打开 php.ini 文件,定位到扩展加载区域。
2、确认以下行未被注释且路径正确:extension=mysqli(Windows 下为 extension=php_mysqli.dll)。
立即学习“PHP免费学习笔记(深入)”;
3、同时检查是否启用了 PDO 支持:extension=pdo_mysql(Windows 下为 extension=php_pdo_mysql.dll)。
4、保存 php.ini 文件,重启 Web 服务器(如 Apache 或 Nginx)。
5、创建一个 test.php 文件,内容为 ,访问该页面,搜索 “mysqli” 和 “pdo_mysql”,确认其状态为 “enabled”。
二、更新数据库连接代码以兼容新 PHP 版本
若原代码使用已废弃的 mysql_* 函数,必须重写为 mysqli 或 PDO 风格。直接替换可避免因函数不存在导致的致命错误。
1、将 mysql_connect($host, $user, $pass) 替换为 $conn = new mysqli($host, $user, $pass, $dbname);。
2、将 mysql_select_db($dbname, $conn) 删除,因其在 mysqli 构造函数中已指定数据库名。
3、将 mysql_query($sql, $conn) 替换为 $conn->query($sql)。
4、检查所有 mysql_* 调用,逐一替换为对应 mysqli 面向对象方式;若使用 PDO,则统一改用 $pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);。
三、验证 MySQLi 默认端口与 socket 设置
PHP 升级后,mysqli 扩展可能不再自动回退到 /tmp/mysql.sock,或对 localhost 解析行为变化(部分版本将 localhost 视为 TCP 连接而非 Unix socket),导致连接超时或拒绝。
1、在连接代码中显式指定 host 为 127.0.0.1 而非 localhost,强制走 TCP 协议。
2、若需使用 Unix socket,构造 mysqli 实例时传入 socket 参数:$conn = new mysqli('localhost', $user, $pass, $dbname, 3306, '/var/run/mysqld/mysqld.sock');。
3、通过命令行执行 mysqladmin variables | grep socket 查看 MySQL 实际 socket 路径,并确保 PHP 中路径一致。
四、检查 OpenSSL 与 TLS 协议兼容性
PHP 7.4+ 默认启用更严格的 TLS 版本要求(如最低 TLS 1.2),若 MySQL 服务器仅支持 TLS 1.0 或未配置有效证书,mysqli 或 PDO 连接会静默失败或抛出 SSL 相关警告。
1、在 php.ini 中临时禁用 SSL 验证测试(仅限调试):mysqli.default_socket=/var/run/mysqld/mysqld.sock 并添加 mysqli.ssl_ca=、mysqli.ssl_cert=、mysqli.ssl_key= 为空值。
2、在 mysqli 连接后立即调用 $conn->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, false);(注意:仅用于排查,不可用于生产)。
3、登录 MySQL 服务器执行 SHOW VARIABLES LIKE 'have_ssl'; 与 SELECT @@tls_version;,确认服务端 TLS 支持状态。
五、校验 php.ini 中 MySQL 相关配置项变更
新版 PHP 修改了若干 MySQL 默认行为参数,例如 mysql.default_port 不再影响 mysqli,而 mysqli.default_port 成为独立控制项;部分发行版还默认关闭了 persistent 连接。
1、在 php.ini 中查找 mysqli.default_port,确认其值为 3306(或与 MySQL 实际端口一致)。
2、检查是否存在 mysqli.allow_persistent = Off,若应用依赖持久连接,需设为 On 并确认 mysqli.max_persistent 数值足够。
3、确认 mysqli.reconnect = On 已启用,防止因连接中断后未自动重连导致后续查询失败。











