连不上远程MySQL主因是网络或权限问题:先用telnet/nc测端口,再查MySQL是否监听0.0.0.0、用户是否授权@'%'、PHP连接时host不能写localhost而要用IP或域名,并注意云服务器安全组与白名单设置。

PHP 连不上远程 MySQL 服务器?先看错误是不是 Connection refused 或 Host 'xxx' is not allowed to connect
绝大多数“连不上远程数据库”的问题,其实卡在两层:MySQL 服务本身没开远程访问权限,或者服务器防火墙/安全组拦住了 3306 端口。PHP 的 mysqli_connect() 或 PDO 只是报错出口,不是根源。
- 用本地命令行测试是否能通:运行
telnet your-server-ip 3306(Windows)或nc -zv your-server-ip 3306(Linux/macOS),不通就说明网络层被阻断 - 确认 MySQL 是否监听了外部地址:登录服务器后查
sudo grep "bind-address" /etc/mysql/mysql.conf.d/mysqld.cnf,如果值是127.0.0.1,需改成0.0.0.0或注释掉该行,然后重启 MySQL(sudo systemctl restart mysql) - 检查用户权限:MySQL 默认只允许
localhost用户登录,远程连接必须显式授权,比如执行GRANT ALL ON mydb.* TO 'myuser'@'%' IDENTIFIED BY 'mypass'; FLUSH PRIVILEGES;
PHP 用 mysqli_connect() 连远程库时,host 参数不能写 localhost
localhost 在 MySQL 客户端中是个特殊值,会强制走 Unix socket 而非 TCP,即使你本意是想连远程——这会导致连接失败且报错不直观。必须用真实 IP 或域名。
- 正确写法:
mysqli_connect('192.168.1.100', 'myuser', 'mypass', 'mydb', 3306)或mysqli_connect('db.example.com', ...) - 错误写法:
mysqli_connect('localhost', ...)(哪怕数据库真在远程服务器上,也别这么写) - 如果 PHP 和 MySQL 在同一台机器但你想走 TCP(比如调试时绕过 socket 权限限制),可用
127.0.0.1替代localhost
PDO 连远程 MySQL 时,DSN 中的 host 和 port 必须显式指定
PDO 不像 mysqli 那样有默认端口 fallback 行为,漏写 port 且远程 MySQL 改过端口(比如用了 3307),就会静默超时。另外,localhost 同样触发 socket 路径逻辑,必须避开。
- 安全写法:
$dsn = 'mysql:host=192.168.1.100;port=3306;dbname=mydb;charset=utf8mb4'; - 别依赖默认端口:即使你确定是 3306,也建议显式写出,避免部署环境差异(如 Docker 容器映射端口不同)
- 加
options防止字符错乱:new PDO($dsn, $user, $pass, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"])
云服务器(阿里云、腾讯云等)连不上?重点查安全组和数据库白名单
云平台默认关闭所有入方向端口,MySQL 的 3306 不在例外列表里。光改 MySQL 配置和用户权限还不够。
专为中小型企业定制的网络办公软件,富有竞争力的十大特性: 1、独创 web服务器、数据库和应用程序全部自动傻瓜安装,建立企业信息中枢 只需3分钟。 2、客户机无需安装专用软件,使用浏览器即可实现全球办公。 3、集成Internet邮件管理组件,提供web方式的远程邮件服务。 4、集成语音会议组件,节省长途话费开支。 5、集成手机短信组件,重要信息可直接发送到员工手机。 6、集成网络硬
立即学习“PHP免费学习笔记(深入)”;
- 阿里云:进 ECS 实例的「安全组」→「配置规则」→ 添加入方向规则,协议类型选
MySQL或自定义 TCP,端口填3306,源 IP 填你的办公 IP 或0.0.0.0/0(仅测试用) - 腾讯云:CVM →「安全组」→「入站规则」→ 新增,目标端口
3306,来源 IP 设置同上 - 部分云数据库(如阿里云 RDS)还单独有「白名单」功能,必须把你的出口 IP 加进去,否则即使安全组放行也连不上
远程数据库连接本质是网络 + 权限 + 配置三者对齐,PHP 层只是最后一环。最容易忽略的是:MySQL 用户授权里的 @'%' 不等于“允许所有 IP”,它只代表不限制主机名,但前提是网络层已通、防火墙已放行、安全组已配好。










