phpEnv的MySQL默认无法被外部连接,因其bind-address=127.0.0.1且root仅限'localhost';需修改my.ini为bind-address=0.0.0.0、skip-networking=0,创建对应host用户并开放防火墙3306端口。

phpEnv 本身不是官方 PHP 环境或数据库工具,而是国内部分 Windows 本地开发包(如“小皮面板”旧称、某些第三方集成包)中对 Apache + PHP + MySQL 封装的俗称。它默认绑定本地 127.0.0.1 或 localhost,不开放远程数据库访问权限——这是绝大多数用户连不上外部数据库的根本原因。
为什么 phpEnv 的 MySQL 默认无法被外部连接
phpEnv 启动的 MySQL 实例默认只监听本地回环地址:bind-address = 127.0.0.1,且 root 用户权限仅限于 'root'@'localhost'。这意味着:
- 从局域网另一台机器(比如你的 Python 脚本、手机 App、或另一台开发机)用
mysql -h 192.168.x.x -u root连接会直接报错Access denied for user 'root'@'192.168.x.x' - 即使改了 bind-address,没建对应 host 的用户,照样拒绝认证
- Windows 防火墙默认拦截 3306 端口,不手动放行,连通性测试(telnet / nc)会超时
修改 my.ini 允许远程监听(关键一步)
找到 phpEnv 安装目录下的 MySQL 配置文件,通常是:phpEnv\MySQL\my.ini(不是 php.ini)。
在 [mysqld] 段落中修改或添加以下两行:
立即学习“PHP免费学习笔记(深入)”;
bind-address = 0.0.0.0 skip-networking = 0
⚠️ 注意:skip-networking = 0 必须显式设为 0(即关闭),否则 MySQL 会完全禁用 TCP 连接,只留 socket;很多 phpEnv 版本默认是 1。
改完重启 phpEnv 的 MySQL 服务(不是重启整个面板,只重启 MySQL)。验证是否生效:
打开命令行执行:netstat -ano | findstr :3306,看到 0.0.0.0:3306 或 [::]:3306 才算监听成功。
创建带远程 host 的 MySQL 用户
不能直接用 root@localhost 远程登录。必须新建一个允许指定 IP 或通配符的用户:
用 phpEnv 自带的 phpMyAdmin 或命令行登录 MySQL(用本地 root)后执行:
CREATE USER 'remote_user'@'192.168.10.%' IDENTIFIED BY 'StrongPass123!'; GRANT SELECT, INSERT, UPDATE ON my_db.* TO 'remote_user'@'192.168.10.%'; FLUSH PRIVILEGES;
说明:
-
'192.168.10.%'表示允许该网段任意 IP 连接;生产环境建议写死具体 IP,如'192.168.10.5' - 不要用
'%'开放所有主机(尤其暴露到公网时),存在严重安全风险 - 如果用的是 MySQL 8.0+,密码插件可能默认是
caching_sha2_password,而老客户端(如某些 PHP 7.4 扩展)不支持,需加一句:ALTER USER 'remote_user'@'192.168.10.%' IDENTIFIED WITH mysql_native_password BY 'StrongPass123!';
PHP 代码里连接外部 phpEnv 数据库的实际写法
假设你的 phpEnv 装在 192.168.10.100,数据库叫 testdb,刚建的用户是 remote_user:
<?php
$host = '192.168.10.100'; // ❌ 不要写 localhost 或 127.0.0.1
$port = 3306;
$username = 'remote_user';
$password = 'StrongPass123!';
$dbname = 'testdb';
<p>$conn = new mysqli($host, $username, $password, $dbname, $port);</p><p>if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "远程连接成功";
?>常见坑:
- PHP 脚本运行在另一台机器(比如 Docker 容器、WAMP、或云服务器),但误填了
localhost—— 那连的是它自己,不是你的 phpEnv - 没指定
$port参数,mysqli 默认用 3306,但如果 phpEnv 改过端口(比如 3307),必须显式传入 - PHP 报错
mysqli_connect(): (HY000/2002): Connection refused:90% 是 MySQL 没监听 0.0.0.0,或防火墙拦了,或用户 host 不匹配
防火墙和用户权限这两步漏掉任意一个,连接就必然失败。很多人反复改配置却卡在“连不上”,其实根本没走到 PHP 层面,是网络或 MySQL 认证拦在了外面。



















