phpenv连不上外部mysql主因是出站防火墙拦截3306端口、mysql未授权phpenv所在ip、或代码中host=‘localhost’误触发unix socket连接;需依次检查windows出站规则、mysql用户host白名单及php.ini socket配置。

phpEnv 为什么连不上外部 MySQL?先看错误类型
连接失败时,mysqli_connect() 或 PDO::__construct() 报的错直接决定排查方向。常见三类:
-
Connection refused:服务没启、端口不通、防火墙拦了 -
Access denied for user:用户名/密码错,或用户绑定的 host 不匹配(比如只允许'user'@'localhost',但 phpEnv 是从192.168.x.x连) -
Host 'xxx' is not allowed to connect:明确是白名单问题,MySQL 拒绝该 IP 的连接请求
别急着改代码——先在 phpEnv 所在机器上用 telnet 10.0.1.5 3306(替换成你的数据库 IP 和端口)测通不通。不通就卡在网络层,后面全白调。
phpEnv 默认防火墙会拦截外部数据库端口
phpEnv 内置的 Windows 防火墙规则默认只放行本地回环(127.0.0.1)和局域网内部分端口,但 不会自动放行出站的 3306 连接。哪怕你数据库服务器防火墙开了,phpEnv 本机出站被拦也会报 Connection refused。
- 打开「Windows Defender 防火墙」→「高级设置」→「出站规则」
- 新建规则 →「端口」→ TCP → 特定远程端口
3306→ 允许连接 → 应用于所有配置文件 - 规则名称建议写
phpEnv-to-MySQL-3306,方便后续识别
注意:不是所有 phpEnv 版本都带图形界面,若用命令行部署,可执行:netsh advfirewall firewall add rule name="phpEnv-to-MySQL-3306" dir=out action=allow protocol=TCP remoteport=3306
MySQL 白名单必须显式添加 phpEnv 所在机器的 IP
云数据库(如阿里云 RDS、腾讯云 CDB)或自建 MySQL,只要没开「允许任意主机连接(%)」,就必须把 phpEnv 服务器的真实出口 IP 加进白名单。很多人填了内网 IP 却忘了查外网出口。
- 登录数据库服务器,执行:
SELECT SUBSTRING_INDEX(USER(), '@', -1) AS current_host;看当前连接来源 IP - 如果返回的是
127.0.0.1,说明你是在数据库本机连的,不是 phpEnv 的真实出口;要从 phpEnv 机器上连一次再查 - 确认 IP 后,在 MySQL 中执行:
CREATE USER 'webuser'@'192.168.10.25' IDENTIFIED BY 'pass123'; GRANT SELECT,INSERT ON mydb.* TO 'webuser'@'192.168.10.25'; FLUSH PRIVILEGES;(IP 替换为实际值)
别用 'webuser'@'%' 图省事——生产环境暴露全网太危险,最小权限原则优先。
localhost 在 phpEnv 里可能走 Unix Socket,导致连外部库失败
phpEnv 的 php.ini 里如果启用了 mysqli.default_socket 或 pdo_mysql.default_socket,且你代码里 host 写的是 localhost,PHP 会尝试用本地 socket 文件连接,而不是走 TCP/IP。这在连外部数据库时必然失败。
- 检查
php.ini是否有类似配置:mysqli.default_socket = /tmp/mysql.sock - 解决方法:把代码里的
$host = 'localhost';改成$host = '127.0.0.1';——仅一字之差,协议完全不同 - 更稳妥的做法:显式指定端口,例如
$host = '10.0.1.5:3307';(如果你的 MySQL 跑在非标端口)
这个点最容易被忽略,因为本地开发时 localhost 没问题,一上 phpEnv 就崩,而且错误信息不提示 socket 问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











