温馨提示×

ubuntu php为何连不上mysql

小樊
39
2026-09-04 12:44:34
栏目: 云计算

在 Ubuntu 上 PHP 连不上 MySQL,常见原因大致可以分为 服务、账号、网络/协议、PHP 扩展、配置 几类。下面按“最常见 → 较少见”给你一个排查清单。


一、MySQL 服务是否启动

systemctl status mysql
# 或
service mysql status

如果没启动:

sudo systemctl start mysql
sudo systemctl enable mysql

二、PHP 是否安装了 MySQL 扩展(非常常见)

PHP 7.4 示例

php -m | grep -E "mysqli|pdo_mysql"

如果没有:

sudo apt install php-mysql
sudo systemctl restart apache2   # 或 php-fpm

很多人装了 PHP,但没装 php-mysql,直接连不上。


三、MySQL 用户权限问题(最常见之一)

1. 用户是否存在 & 是否允许连接

SELECT user, host FROM mysql.user;

2. 常见错误

  • 用户是 root@localhost,但 PHP 用 127.0.0.1
  • 用户只允许 localhost,但 PHP 用 TCP

解决示例:

CREATE USER 'phpuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON dbname.* TO 'phpuser'@'localhost';
FLUSH PRIVILEGES;

四、socket 还是 TCP 的问题(Ubuntu 非常典型)

错误示例

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

PHP 中两种连法

// TCP
new mysqli('127.0.0.1', 'user', 'pass', 'db');

// Socket
new mysqli('localhost', 'user', 'pass', 'db');

如果 localhost 报错,多半是:

  • socket 路径不对
  • php.ini 中 mysqli.default_socket 没配置

查看:

ls -l /var/run/mysqld/mysqld.sock

php.ini:

mysqli.default_socket = /var/run/mysqld/mysqld.sock

五、MySQL 8 的认证插件问题(很常见)

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

七、Apache / PHP-FPM 没重启

改完配置一定要:

sudo systemctl restart apache2
# 或
sudo systemctl restart php-fpm

八、快速自检 PHP 连接脚本

<?php
$conn = new mysqli('127.0.0.1', 'user', 'pass', 'db');
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
echo "连接成功";

如果你愿意

你可以直接把 报错信息 贴出来(哪怕一行),我可以精准告诉你是哪一种原因。

0