在 Ubuntu 上 PHP 连不上数据库,常见原因可以归纳为这几类。你可以对照排查:
如果你用的是 MySQLi 或 PDO_MySQL:
php -m | grep -i mysql
如果没有输出,说明扩展没装。
安装:
# PHP 8.1 示例
sudo apt install php8.1-mysql
# 或通用
sudo apt install php-mysql
重启服务:
sudo systemctl restart apache2
# 或
sudo systemctl restart php8.1-fpm
sudo apt install php8.1-pgsql
systemctl status mysql
# 或
systemctl status mariadb
启动:
sudo systemctl start mysql
sudo systemctl enable mysql
常见错误:
localhost 在 PHP 中可能走 socket 而不是 TCP<?php
try {
$pdo = new PDO(
"mysql:host=127.0.0.1;dbname=test",
"user",
"password"
);
echo "OK";
} catch (Exception $e) {
echo $e->getMessage();
}
用
127.0.0.1而不是localhost,排除 socket 问题
MySQL 默认可能不允许远程或 socket 登录。
登录 MySQL:
mysql -u root -p
查看用户:
SELECT user, host FROM mysql.user;
授权示例:
CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON test.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
PHP 和 MySQL socket 路径不一致会导致连不上。
查看 MySQL socket:
mysql -e "SHOW VARIABLES LIKE 'socket';"
PHP 配置中确认:
pdo_mysql.default_socket = /var/run/mysqld/mysqld.sock
如果是远程数据库:
telnet 数据库IP 3306
Ubuntu 防火墙:
sudo ufw allow 3306
tail -f /var/log/apache2/error.log
# 或
tail -f /var/log/php8.1-fpm.log
tail -f /var/log/mysql/error.log
如果你愿意,可以把:
发出来,我可以直接帮你定位是哪一步的问题。