php连不上mysql主因是扩展未启用、mysql服务未运行或连接地址错误;需确认php.ini中extension=mysqli和extension=pdo_mysql已启用并重启服务,检查mysql状态与监听方式,注意mysql 8.0+认证插件兼容性。

独立服务器上 PHP 连不上 MySQL,90% 是因为扩展没启、服务没跑、或连错地址——不是代码写错了,是环境链路断在底层。
确认 mysqli 和 pdo_mysql 扩展已启用
PHP 8.0+ 已彻底移除 mysql 扩展,只认 mysqli 和 pdo_mysql。哪怕你用的是面向过程的 mysqli_connect(),也必须确保 extension=mysqli 这一行在 php.ini 里没被注释。
- 运行
php --ini查 CLI 环境用的php.ini;访问phpinfo()页面查 Web 环境用的路径,二者可能不同 - 打开对应
php.ini,确认以下两行未被注释(即前面没有;):extension=mysqli<br>extension=pdo_mysql
- 改完后必须重启服务:Apache 用
sudo systemctl restart apache2,Nginx + PHP-FPM 则重启php-fpm和nginx - 验证是否生效:
php -m | grep -i mysql应输出mysqli和pdo_mysql
检查 MySQL 服务状态与监听方式
Connection refused 或 No such file or directory 不是 PHP 错误,是 PHP 根本没找到 MySQL 进程或 socket 文件。
- 先看 MySQL 是否在运行:
sudo systemctl status mysql(Ubuntu/Debian)或sudo systemctl status mysqld(CentOS/RHEL) - 再查它监听在哪:
mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';"(Unix socket 路径)或"SHOW VARIABLES LIKE 'port';"(TCP 端口,默认 3306) - PHP 中用
'localhost'会优先走 Unix socket(Linux/macOS),而'127.0.0.1'强制走 TCP;若 MySQL 配了skip-networking,就得用 socket 路径显式指定,比如new mysqli('localhost', $user, $pass, $db, null, '/var/run/mysqld/mysqld.sock') - 防火墙别漏掉:
sudo ufw allow 3306(Ubuntu)或sudo firewall-cmd --permanent --add-port=3306/tcp(CentOS)
连接时注意 MySQL 8.0+ 的认证插件兼容性
MySQL 8.0 默认用 caching_sha2_password,而老版 PHP(尤其 mysqli 和 PDO 可能不支持,直接报 Authentication plugin 'caching_sha2_password' cannot be loaded。
- 临时方案:降级用户认证方式(仅限内网或测试环境):
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';<br>FLUSH PRIVILEGES;
- 长期方案:升级 PHP 到 7.4+,并确认
mysqli编译时链接了新版 MySQL 客户端库(mysqlnd) - PDO DSN 中可加
&serverVersion=8.0辅助识别,但不能绕过认证插件不兼容问题
用 PDO 还是 MySQLi?选哪个更稳
新项目无脑选 PDO;已有 MySQLi 代码且不跨数据库,继续用也完全没问题——但别混用,更别用废弃的 mysql_* 函数。
- PDO 优势明显:统一错误模式(
PDO::ERRMODE_EXCEPTION)、命名参数、自动资源释放、换数据库只需改 DSN - MySQLi 面向对象写法更贴近原生 SQL 感觉,但
connect_error属性必须手动检查,close()忘关会导致连接泄漏 - 两者都必须设字符集:
mysqli_set_charset($conn, 'utf8mb4')或 DSN 加;charset=utf8mb4,否则中文存成问号 - 生产环境禁止把密码写死在脚本里;配置文件要放 Web 根目录外,或用
open_basedir限制读取范围
最常被跳过的其实是 MySQL 用户权限和 bind-address 配置——哪怕扩展全开、服务全跑,如果 MySQL 只监听 127.0.0.1 却用 localhost 连,或者用户授权绑定了具体 IP 却用了通配符主机,照样连不上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











