phpenv 本身不支持 ssh 隧道,需在 windows 本地用 openssh 启动 ssh -l 隧道(如 ssh -fn -l 3307:222.222.222.222:3306 user@111.111.111.111),再让 phpmyadmin 或 php 脚本连接 127.0.0.1:3307;务必禁用 localhost 改用 127.0.0.1 防绕过隧道,且隧道无自动重连。

phpEnv 本身不内置 SSH 隧道功能,它只是一个 Windows 下的 PHP 环境集成包(含 Apache、MySQL、PHP、phpMyAdmin 等),所有数据库连接仍走标准 MySQL 协议。要让它“通过 SSH 隧道访问远程数据库”,本质是:在 Windows 本地启动一个 ssh -L 隧道进程,再让 phpEnv 中的 phpMyAdmin 或 PHP 脚本连本地端口。
为什么 phpEnv 里直接填远程 IP:3306 会失败
因为 phpEnv 自带的 MySQL 是本地服务(127.0.0.1:3306),你改配置去连外网地址时,实际触发的是 PHP 的 mysqli 或 PDO 直连——这要求远程 MySQL 必须:开放公网 3306 端口、允许你的 IP、且协议明文传输。绝大多数生产环境禁止这么做。
常见错误现象:mysqli_connect(): (HY000/2003): Can't connect to MySQL server on 'xxx.xxx.xxx.xxx',或连接超时、拒绝连接。
- 不是 phpEnv 问题,是网络策略和 MySQL 安全配置限制
- phpEnv 没有 SSH 客户端组件,不能在 PHP 里调用
ssh2_connect()建隧道(Windows 下该扩展极难启用,且不推荐)
Windows 下用 OpenSSH 启动本地隧道(推荐)
Win10 1809+ / Win11 自带 OpenSSH Client,无需额外安装。打开 PowerShell 或 CMD,执行:
ssh -fN -L 3307:222.222.222.222:3306 -p 22 user@111.111.111.111
说明:
-
-fN让 ssh 后台运行、不打开 shell -
-L 3307:222.222.222.222:3306表示:把本地3307端口流量,转发到跳板机(111.111.111.111)上,再由它访问目标 MySQL(222.222.222.222:3306) -
-p 22是跳板机 SSH 端口;若为非标端口(如 2222),需改成-p 2222 - 首次连接会提示确认 host key,输入
yes;之后输密码或自动读私钥(如id_rsa在%USERPROFILE%\.ssh\)
验证是否成功:netstat -ano | findstr :3307 应看到 LISTENING;断开后隧道即失效,需重跑命令。
phpMyAdmin 配置必须用 127.0.0.1 + 隧道端口
编辑 phpEnv 安装目录下的 phpmyadmin\config.inc.php,找到服务器配置段(通常在 $cfg['Servers'][$i]),只改两行:
-
$cfg['Servers'][$i]['host'] = '127.0.0.1';—— 不能写localhost,否则 PHP 会走 Unix socket 或命名管道,绕过隧道 -
$cfg['Servers'][$i]['port'] = '3307';—— 必须和ssh -L后面的本地端口号一致
改完保存,重启 phpEnv 的 Apache 服务(或整个 phpEnv 控制面板)。登录 phpMyAdmin 后,在开发者工具 Network 标签页看请求 URL,确认是发往 :3307 而非 :3306。
PHP 脚本里连隧道数据库的写法
任何用 mysqli 或 PDO 的脚本,只要目标是那个远程库,就统一连本地隧道端口:
$mysqli = new mysqli('127.0.0.1', 'db_user', 'db_pass', 'db_name', 3307);
或 PDO:
$pdo = new PDO('mysql:host=127.0.0.1;port=3307;dbname=db_name;charset=utf8', 'db_user', 'db_pass');
注意点:
- 主机必须是
127.0.0.1,不是localhost,也不是跳板机或目标库的 IP - 端口是隧道本地端口(如
3307),不是目标 MySQL 的 3306 - 用户名/密码是目标 MySQL 的凭据,不是 SSH 账号
如果脚本部署在 phpEnv 的 Apache 下,且隧道是当前 Windows 用户启动的,权限无问题;但若用系统服务方式运行 Apache,可能无法继承用户 SSH 会话,此时隧道需用 ssh -N -L 手动保持前台运行,或改用 Windows 服务包装。
隧道一旦中断,所有连接立即失效,没有自动重连机制——这是最容易被忽略的运维盲点。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











