在 Ubuntu 上 PHP 连不上 MySQL,常见原因大致可以分为 服务、账号、网络/协议、PHP 扩展、配置 几类。下面按“最常见 → 较少见”给你一个排查清单。
systemctl status mysql
# 或
service mysql status
如果没启动:
sudo systemctl start mysql
sudo systemctl enable mysql
php -m | grep -E "mysqli|pdo_mysql"
如果没有:
sudo apt install php-mysql
sudo systemctl restart apache2 # 或 php-fpm
很多人装了 PHP,但没装
php-mysql,直接连不上。
SELECT user, host FROM mysql.user;
root@localhost,但 PHP 用 127.0.0.1localhost,但 PHP 用 TCP解决示例:
CREATE USER 'phpuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON dbname.* TO 'phpuser'@'localhost';
FLUSH PRIVILEGES;
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
// TCP
new mysqli('127.0.0.1', 'user', 'pass', 'db');
// Socket
new mysqli('localhost', 'user', 'pass', 'db');
如果 localhost 报错,多半是:
mysqli.default_socket 没配置查看:
ls -l /var/run/mysqld/mysqld.sock
php.ini:
mysqli.default_socket = /var/run/mysqld/mysqld.sock
MySQL 8 默认:
caching_sha2_password
老 PHP 不支持。
ALTER USER 'phpuser'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;
本地一般不用管,但如果是远程:
sudo ufw allow 3306
MySQL 配置:
bind-address = 0.0.0.0
改完配置一定要:
sudo systemctl restart apache2
# 或
sudo systemctl restart php-fpm
<?php
$conn = new mysqli('127.0.0.1', 'user', 'pass', 'db');
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
你可以直接把 报错信息 贴出来(哪怕一行),我可以精准告诉你是哪一种原因。