在 Ubuntu 上 PHP 连不上 MySQL,常见原因和排查思路如下(按出现频率从高到低):
不同 PHP 版本扩展名不同:
mysqli 或 pdo_mysqlmysql(已废弃)检查是否安装:
php -m | grep -i mysql
如果没有,安装:
# PHP 7.x / 8.x 示例
sudo apt install php-mysql
# 重启服务
sudo systemctl restart apache2
# 或
sudo systemctl restart php8.1-fpm
systemctl status mysql
启动:
sudo systemctl start mysql
常见错误:
mysqli_connect("localhost", ...)
在 Ubuntu 上:
localhost → 走 socket127.0.0.1 → 走 TCP如果 socket 配置不对,建议先用:
mysqli_connect("127.0.0.1", "user", "pass", "db");
MySQL 用户可能不允许连接:
SELECT user, host FROM mysql.user;
如果用户是:
user@localhost
但你用 127.0.0.1 连接,就会失败。
解决:
CREATE USER 'user'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON db.* TO 'user'@'%';
FLUSH PRIVILEGES;
MySQL 8 默认:
caching_sha2_password
某些 PHP 版本不支持。
修改用户:
ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli("127.0.0.1", "user", "pass", "db");
或:
echo mysqli_connect_error();
本地一般不用管:
sudo ufw status
| 错误信息 | 原因 |
|---|---|
| Connection refused | MySQL 没启动 / 端口错 |
| Access denied | 用户名密码或权限错 |
| No such file or directory | socket 路径不对 |
| unknown authentication method | 认证插件不兼容 |
如果你愿意,可以把 PHP 连接代码 + 报错信息 发出来,我可以直接帮你定位是哪一步出问题。