在 CentOS 环境下运行 PHP 应用时,日志中突然出现「数据库连接失败」的错误提示,先不必急于怀疑代码,问题往往出在以下这几个常见环节。按照顺序逐一排查,通常都能顺利解决。

1. 数据库服务未运行或无法正常连接。
这是最容易遇到的情况。先确认 MySQL 或 MariaDB 是否在后台正常工作中——执行以下命令查看服务状态:
sudo systemctl status mysqld
如果显示未启动,直接将其启动:
sudo systemctl start mysqld
若启动后依然无法连接,检查是否已开启自启动(`sudo systemctl enable mysqld`),避免系统重启后再次出现相同问题。
2. 防火墙拦截了数据库通信端口。
PHP 与数据库之间的默认通信端口(3306)可能被防火墙阻挡。快速放行 MySQL 服务的方法如下:
sudo firewall-cmd --permanent --zone=public --add-service=mysql
sudo firewall-cmd --reload
如果已经修改了数据库端口,请将 `--add-service=mysql` 替换为 `--add-port=自定义端口/tcp` 即可。
3. 数据库连接配置存在错误。
这是开发人员最常犯的错误——主机名、端口、用户名、密码,任意一项填写错误都会导致连接失败。请前往 PHP 项目的配置文件(例如 `.env` 或 `config.php`)仔细核对每一项。特别提醒:`localhost` 和 `127.0.0.1` 在某些环境下的行为存在差异,若数据库采用 TCP/IP 连接,建议使用 `127.0.0.1` 而非 `localhost`。
4. 数据库用户权限未正确授予。
用户账户存在并不代表具备操作权限。使用 root 登录数据库进行检查:
mysql -u root -p
然后查看用户列表及其权限:
SELECT user, host FROM mysql.user;
SHOW GRANTS FOR 'your_username'@'your_host';
若发现权限不足,直接为相应数据库授权:
GRANT ALL PRIVILEGES ON your_database.* TO 'your_username'@'your_host';
FLUSH PRIVILEGES;
注意 `host` 字段必须与 PHP 连接时使用的来源地址保持一致——是 `localhost` 还是 `%`(任意主机),切勿混淆。
5. PHP 缺少对应的数据库扩展。
仅有数据库服务还不够,PHP 必须安装相应的驱动。以 MySQL 为例:
sudo yum install php-mysql
如果是 MariaDB,有时需要 `php-mariadb`(但多数情况下 `php-mysql` 也能兼容)。安装扩展后务必重启 web 服务器:
sudo systemctl restart httpd # Apache
# 或者
sudo systemctl restart nginx # Nginx
完成以上五个步骤后,绝大多数数据库连接失败的问题都能得到解决。如果问题依然存在,请查看 PHP 日志中具体的错误信息——是「Connection refused」还是「Access denied」?前者通常指向服务或防火墙问题,后者则与用户名、密码或权限相关。带着明确的错误详情去排查,方向会更加清晰。
