当前位置:首页 > PHP教程 > php环境安装 > 列表

phpEnv配置数据库远程访问 phpEnv开启MySQL远程连接

发布:smiling 来源: PHP粉丝网  添加日期:2026-05-23 18:07:06 浏览: 评论:0 

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 交叉验证,不能只靠“连一下试试”。

Tags: phpEnv配置数据库远程访问 phpEnv开启MySQL远程连接

分享到: