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远程连接
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)
