phpenv开启mysql远程访问需三步:改my.ini中bind-address=0.0.0.0并删skip-networking;创建'%'主机用户并授权、刷新权限;windows防火墙放行3306端口,且php/navicat连接时host必须用127.0.0.1而非localhost。

phpEnv 默认不开放 MySQL 远程访问,bind-address = 127.0.0.1 + root@'localhost' 是双重封锁。只要改错一处、漏掉一步,Navicat 或 PHP 就会报 Host 'xxx' is not allowed to connect 或直接 Connection refused。
修改 my.ini 中的 bind-address 并确认监听状态
phpEnv 的 MySQL 配置文件路径通常是 phpEnv\mysql\my.ini(具体看安装目录,比如 C:\phpenv\mysql8\my.ini)。打开后定位到 [mysqld] 段落:
- 必须将
bind-address = 127.0.0.1改为bind-address = 0.0.0.0;写成*、留空或注释掉该行,MySQL 8.0+ 会启动失败 - 检查是否存在
skip-networking—— 如果有,必须删掉或用#注释,否则 MySQL 彻底禁用 TCP - 保存后,**只重启 MySQL 服务**(phpEnv 控制面板点「Restart MySQL」,不是「Restart Environment」)
- 验证是否生效:命令行运行
netstat -an | findstr :3306,看到0.0.0.0:3306或*:3306才算成功
创建或更新 MySQL 用户权限,host 必须是 '%' 或具体 IP
phpEnv 初始化的 root 用户默认只有 'root'@'localhost',它无法响应任何 TCP 连接请求(包括本机 Navicat、PHP 的 mysqli_connect('127.0.0.1')):
- 推荐新建专用用户,避免动
root:CREATE USER 'devuser'@'%' IDENTIFIED BY 'StrongPass123!'; - 授权时明确指定库范围,别用
ON *.*:GRANT SELECT, INSERT, UPDATE ON myapp_db.* TO 'devuser'@'%'; -
FLUSH PRIVILEGES;是强制刷新内存权限表,漏掉就等于没授权 - MySQL 8.0+ 用户若连不上旧版客户端(如 Navicat 15 以下、某些 PHP 环境),需额外执行:
ALTER USER 'devuser'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPass123!';
Windows 防火墙必须放行 3306(或你实际配置的端口)
即使 MySQL 已监听 0.0.0.0:3306、用户也授权了,Windows 防火墙仍会静默丢弃所有入站 TCP 请求:
- 打开「控制面板 → Windows Defender 防火墙 → 高级设置」→「入站规则」→「新建规则」
- 选「端口」→「TCP」→「特定本地端口:3306」(如果改过端口,比如 3307,就填那个)
- 「允许连接」→ 勾选「域」「专用」「公用」(局域网测试至少勾「专用」)
- 命名建议含端口号,如
MySQL-3306-In,方便后续排查 - 第三方杀毒软件(如 360、火绒)也可能拦截,临时关闭测试可快速定位是否是它在作祟
PHP 或 Navicat 连接时,host 别写 localhost
这是最隐蔽的坑:localhost 在 MySQL 客户端中是特殊关键字,会强制走 socket 或命名管道,完全绕过 TCP/IP 层。结果就是——配置全对,但连的压根不是你刚放开的那个 MySQL 实例:
- PHP 中用
mysqli_connect():第一个参数必须是 IP,比如mysqli_connect('192.168.1.105', ...)或mysqli_connect('127.0.0.1', ...),绝不能是'localhost' - PDO DSN 必须显式带
charset和port:mysql:host=192.168.1.105;port=3306;dbname=test;charset=utf8mb4 - Navicat 连接时,“主机名/IP 地址”填
127.0.0.1(不是localhost),端口严格按my.ini里写的填 - 如果远程 MySQL 开启了
skip-name-resolve,host 字段只能填 IP,填域名会卡住无响应
真正卡住人的地方,往往不是某一步做错了,而是三处配置(my.ini、MySQL 用户权限、Windows 防火墙)里有一处没生效,或者 PHP/Navicat 的 host 写法触发了 socket 回退机制。每次改完,都得用 netstat、telnet、SELECT User, Host FROM mysql.user 交叉验证,不能只靠“连一下试试”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











