phpenv默认限制mysql仅本地访问,需三步解决:①修改phpenv\mysql\my.ini中bind-address=0.0.0.0并重启mysql服务;②在mysql中创建远程用户(如'webapp'@'192.168.1.100')并授权;③windows防火墙放行3306端口,php代码中host必须填真实局域网ip而非localhost。

phpEnv 是 Windows 下的集成环境套件,它默认把 MySQL 绑定在 127.0.0.1,且 root 用户只允许 localhost 登录 —— 所以直接填服务器 IP 在 PHP 里连不上,不是代码问题,是环境默认锁死了外网访问。
修改 phpEnv 中的 MySQL 配置文件 bind-address
phpEnv 的 MySQL 配置文件通常位于:phpEnv\MySQL\my.ini(路径可能因版本略有差异,如 phpEnv\MySQL57\my.ini)。不要改错文件,否则重启无效。
- 用记事本或 VS Code 打开该
my.ini文件,在[mysqld]段下找bind-address行 - 若存在且值为
127.0.0.1,改为:bind-address = 0.0.0.0 - 若该行被注释(前面有
#)或根本不存在,就手动添加这一行(必须在[mysqld]区块内) - 保存后,**必须通过 phpEnv 控制面板重启 MySQL 服务**(不能只点“重启环境”,要单独重启 MySQL)
- 验证是否生效:打开命令行,执行
netstat -an | findstr :3306,看到0.0.0.0:3306或*:3306才算监听成功
给 MySQL 用户授权远程 host(% 或指定 IP)
phpEnv 自带的 MySQL 默认只建了 root@localhost,不支持远程连接。你得进 MySQL 命令行手动加权限,不能跳过这步。
- 在 phpEnv 控制面板中点击「MySQL CLI」或手动运行:
phpEnv\MySQL\bin\mysql.exe -u root -p - 执行:
USE mysql; - 查看当前用户限制:
SELECT User, Host FROM user;—— 如果root对应的Host是localhost,就不能远程连 - 安全做法(推荐):新建专用用户,限定来源 IP:
CREATE USER 'webapp'@'192.168.1.100' IDENTIFIED BY 'StrongPass123!'; GRANT SELECT,INSERT,UPDATE ON mydb.* TO 'webapp'@'192.168.1.100'; FLUSH PRIVILEGES; - 开发测试临时做法:放开 root 远程(仅限内网):
CREATE USER 'root'@'%' IDENTIFIED BY '你的强密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
Windows 防火墙必须放行 3306 端口
phpEnv 跑在 Windows 上,系统防火墙默认会拦截所有入站 TCP 请求 —— 即使 MySQL 配置全对、用户也授权了,外面照样连不上。
- 按
Win + R输入wf.msc打开「高级安全 Windows 防火墙」 - 左侧选「入站规则」→ 右侧点「新建规则…」→ 选「端口」→ 下一步 → 选「TCP」→ 特定本地端口填
3306→ 下一步 → 选「允许连接」→ 下一步 → 勾选「域」「专用」「公用」(开发机建议全选)→ 下一步 → 规则名称写MySQL Remote Access - 完成后,在远程机器上用
telnet your-win-ip 3306测试端口是否通(没装 telnet 可用 PowerShell:Test-NetConnection -ComputerName your-win-ip -Port 3306)
PHP 代码里别写 localhost,要用真实 IP 或域名
很多人在 phpEnv 里写 $host = 'localhost' 测试没问题,一换远程就报 Can't connect to MySQL server —— 因为 localhost 在 MySQL 协议里会强制走 socket,不走 TCP,根本绕不开 bind-address 设置。
- 远程连接时,
$host必须填运行 phpEnv 的那台 Windows 机器的真实局域网 IP(如192.168.1.50),不能填127.0.0.1或localhost - PDO 示例:
$pdo = new PDO('mysql:host=192.168.1.50;port=3306;dbname=test', 'webapp', 'StrongPass123!'); -
mysqli 示例:
$conn = new mysqli('192.168.1.50', 'webapp', 'StrongPass123!', 'test', 3306); - 如果从公网访问(比如手机连家宽),还需在路由器做端口映射(3306 → 你的 Windows 内网 IP),并确认 ISP 没封 3306(很多家用宽带会封)
最常被忽略的是 Windows 防火墙和 localhost 这个字面陷阱 —— 两者任一没处理,都会让前面所有配置变成无用功。调试时优先用 telnet 和 netstat 确认端口层通不通,再查 MySQL 权限和配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











