php连接远程mysql失败首要排查网络与权限:先用telnet或nc检测3306端口连通性;检查mysql bind-address是否为0.0.0.0、云服务器安全组是否放行、用户是否授权远程ip(如'myapp'@'10.0.2.3');php中host不可用localhost而须用127.0.0.1或具体ip,并显式指定非默认端口。

php连接远程数据库失败\_排查网络与权限的问题【详解】
PHP 连不上远程 MySQL(或 MariaDB)数据库,90% 的情况不是代码写错了,而是网络通不了、用户没授权、或者服务端压根没开远程访问。别急着改 mysqli_connect() 参数,先确认底层通路是否真实存在。
telnet 或 nc 能连上 3306 端口吗?
这是第一道门槛。PHP 的连接失败,往往卡在 TCP 层就断了——根本没走到 MySQL 认证那步。
- 在 PHP 所在服务器上执行:
telnet your-db-host.com 3306(或用nc -zv your-db-host.com 3306) - 如果超时或报
Connection refused,说明:防火墙(云厂商安全组 / 本地 iptables)、MySQL 服务未监听公网、或 MySQL 绑定了127.0.0.1 - MySQL 默认配置
bind-address = 127.0.0.1,必须改成0.0.0.0或具体内网 IP,并重启服务 - 云服务器(如阿里云、腾讯云)务必检查安全组规则:入方向需放行目标端口(通常是
3306),源 IP 填 PHP 服务器的公网或内网 IP,不能只写0.0.0.0/0
MySQL 用户有没有被授权从远程主机登录?
即使端口通了,MySQL 仍会拒绝连接,因为默认创建的用户只允许 'user'@'localhost' 登录,不认你的 PHP 服务器 IP。
- 登录 MySQL 服务端,执行:
SELECT User, Host FROM mysql.user;,确认是否存在类似'myapp'@'192.168.10.5'或'myapp'@'%'的记录 - 不要直接用
'user'@'%'(尤其生产环境),优先指定 PHP 服务器的准确 IP 或内网段,比如'myapp'@'10.0.1.%' - 授权命令示例:
GRANT SELECT,INSERT ON mydb.* TO 'myapp'@'10.0.2.3' IDENTIFIED BY 'strong-pass'; FLUSH PRIVILEGES; - 注意:
IDENTIFIED BY在 MySQL 8+ 中已弃用,应改用ALTER USER 'myapp'@'10.0.2.3' IDENTIFIED WITH mysql_native_password BY 'strong-pass';
PHP 连接时用了正确的 host 和 port 吗?
常见低级但致命错误:把域名当 IP 用、混淆了内网/公网地址、漏写了端口、或误信“localhost”能走 TCP。
立即学习“PHP免费学习笔记(深入)”;
-
localhost在 MySQL 客户端中会强制走 Unix socket(即使你指定了 port),想走 TCP 必须用127.0.0.1 - 远程连接必须显式指定 host(如
'db.example.com'或'10.10.20.5'),不能依赖 DNS 别名未解析成功 - 如果 MySQL 服务运行在非标准端口(比如
3307),mysqli_connect()的第四个参数必须传 port:mysqli_connect('db.example.com', 'u', 'p', 'db', 3307) - 使用 PDO 时,DSN 中的 port 要写成
host=db.example.com;port=3307;dbname=test,漏掉port=前缀会导致忽略
真正卡住人的,往往是“端口看起来通了,用户也建了,但 PHP 一连就报 Connection refused 或 Access denied”,这时候得回过头再查一遍 bind-address 和安全组——它们比 PHP 代码更沉默,也更难被日志暴露。











