php数据库连接被拒需依次检查:一、服务状态,确认mysql正运行并监听3306端口;二、绑定地址,修改bind-address为0.0.0.0或127.0.0.1并重启服务;三、区分localhost与127.0.0.1,避免socket/tcp混淆;四、验证用户host权限匹配;五、启用错误报告捕获真实异常。

PHP8数据库连接被拒意味着脚本尝试建立TCP连接时收到“Connection refused”响应,这说明数据库服务进程未监听指定地址端口,或绑定配置阻止了当前来源IP的接入。
确认MySQL服务正在运行并监听正确地址
第一步:登录服务器终端,执行systemctl status mysql或systemctl status mariadb。若状态为inactive (dead)或failed,立即运行systemctl start mysql启动服务。
第二步:检查MySQL实际监听的网络接口。执行ss -tlnp | grep :3306(Linux)或netstat -ano | findstr :3306(Windows)。如果输出为空,说明MySQL没有监听任何TCP端口——它可能只绑定了socket文件(如/var/run/mysqld/mysqld.sock),此时PHP用localhost连接会失败,必须改用127.0.0.1或修改MySQL配置。
第三步:打开/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)或/etc/my.cnf(CentOS),查找bind-address行。若值为127.0.0.1,表示仅接受本地回环连接;若为0.0.0.0才允许所有IP接入。修改后务必执行systemctl restart mysql生效。
验证PHP是否能直连数据库端口
在PHP所在服务器上执行nc -zv 127.0.0.1 3306(如无nc,可用telnet 127.0.0.1 3306)。若返回Connection refused,证明MySQL根本没在该地址端口监听;若卡住或超时,则可能是防火墙拦截或路由不通。
注意:【不要跳过这一步】很多开发者直接改PHP代码,却忽略底层连通性已断。只要nc不通,后续所有参数检查都是徒劳。
区分localhost与127.0.0.1的本质差异
方法一:强制走TCP协议
将PHP连接中的$host = 'localhost'改为$host = '127.0.0.1'。MySQL对localhost有特殊处理——默认使用Unix socket而非TCP,而socket路径可能未配置或权限不对;127.0.0.1则明确走TCP,绕过socket机制。
方法二:检查MySQL用户表绑定
用root登录MySQL:执行SELECT User, Host FROM mysql.user WHERE User = 'your_user';。若结果中只有'your_user'@'localhost',但PHP实际以127.0.0.1发起连接,就会被拒绝。此时需创建对应用户:CREATE USER 'your_user'@'127.0.0.1' IDENTIFIED BY 'password'; GRANT ALL ON db_name.* TO 'your_user'@'127.0.0.1'; FLUSH PRIVILEGES;
启用错误报告捕获真实异常
在连接代码前插入三行调试指令:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
这样PDO或mysqli会直接抛出带错误码的原始信息,例如SQLSTATE[HY000] [2002] Connection refused(端口拒绝)或SQLSTATE[HY000] [1045] Access denied(认证失败),避免被ThinkPHP等框架封装后丢失关键线索。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











