PHP-FPM连接数据库需依赖对应的PHP扩展(如mysqli或pdo_mysql)。若未安装,会导致扩展缺失错误。
sudo apt-get install php8.1-mysql
sudo systemctl restart php8.1-fpm
phpinfo.php文件(内容为<?php phpinfo(); ?>),通过浏览器访问确认扩展是否存在。若MySQL未启动,PHP-FPM无法建立连接。
sudo systemctl status mysql
sudo systemctl start mysql
sudo systemctl enable mysql
PHP代码中的连接信息(主机名、用户名、密码、数据库名)需与数据库实际配置一致。
mysqli_connect()或PDO连接字符串(如mysql:host=localhost;dbname=test)。.env文件中的DB_HOST、DB_USERNAME等参数。localhost,远程数据库需填写IP或域名。用户需具备访问目标数据库的权限,否则会返回“Access denied”错误。
mysql -u root -p
SELECT User, Host FROM mysql.user WHERE User = 'your_username';
SHOW GRANTS FOR 'your_username'@'localhost';
GRANT ALL PRIVILEGES ON your_database.* TO 'your_username'@'localhost' IDENTIFIED BY 'your_password';
FLUSH PRIVILEGES;
若PHP-FPM与MySQL位于不同服务器,需开放MySQL端口(默认3306)。
sudo ufw allow 3306/tcp
sudo ufw reload
日志是定位问题的关键,可获取具体错误信息(如连接超时、权限拒绝)。
/var/log/php-fpm.log或/var/log/php8.1-fpm.log(取决于PHP版本)。journalctl查看:sudo journalctl -u php8.1-fpm -n 50 --no-pager
/var/log/mysql/error.log,可通过以下命令查看:sudo tail -n 50 /var/log/mysql/error.log
MySQL默认可能仅绑定到127.0.0.1,导致远程连接失败。
/etc/mysql/mysql.conf.d/mysqld.cnf(或/etc/mysql/my.cnf),找到bind-address行:bind-address = 0.0.0.0 # 允许所有IP连接(生产环境建议指定具体IP)
sudo systemctl restart mysql
使用命令行工具验证连接是否正常,排除PHP代码问题。
mysql -h localhost -u your_username -p your_database
输入密码后若能进入MySQL命令行,说明连接正常;若失败,需根据错误信息进一步排查(如密码错误、用户权限不足)。按照以上步骤逐一排查,通常可解决PHP-FPM连接数据库失败的问题。若问题仍存在,建议结合错误日志中的具体信息进一步分析(如连接超时需检查网络,权限问题需调整用户权限)。