thinkphp 必须配置为连接本地隧道端口:'hostname' => '127.0.0.1','hostport' => 3307(与 ssh -l 一致),dsn 中需显式指定 port;ssh 隧道须用 -fn -o exitonforwardfailure=yes 稳定运行,并以 php-fpm 同用户通过 systemd 管理。

不能直接在 ThinkPHP 配置里填远程数据库地址,必须走本地端口转发;否则流量明文暴露、绕过 SSH 加密,等于没隧道。
ThinkPHP 的 database.php 怎么填才走 SSH 隧道
核心就一条:MySQL 主机地址必须是 127.0.0.1,端口必须是你本地绑的隧道端口(比如 3307),而不是远程数据库的真实 IP 和 3306。
-
'hostname' => '127.0.0.1'—— 绝对不能写成远程 MySQL 的 IP 或域名,也不能写localhost(某些 PHP 环境下会走 Unix socket,跳过 TCP 隧道) -
'hostport' => 3307—— 必须和ssh -L命令里指定的本地端口完全一致 -
'username'和'password'是远程 MySQL 的账号密码,不是 SSH 跳板机的 - 如果用的是 ThinkPHP 6+,
hostport要写进dsn字符串里,例如:mysql:host=127.0.0.1;port=3307;dbname=mydb
SSH 隧道命令怎么写才稳定可靠
手动建隧道时,-fN 是生产环境刚需,否则终端一关、进程就死;但很多人漏了 -o ExitOnForwardFailure=yes,导致端口被占或目标不可达时静默失败,ThinkPHP 连不上还查不出原因。
- 推荐命令:
ssh -fN -o ExitOnForwardFailure=yes -L 3307:192.168.1.20:3306 user@203.101.55.88 - 验证是否真通:
lsof -i :3307看进程是否存在,再执行mysql -h 127.0.0.1 -P 3307 -u dbuser -p手动连一次 - 别用
0.0.0.0:3307绑定 —— 这会让局域网其他机器也能访问你的隧道端口,相当于把内网数据库“侧漏”出去 - 跳板机 SSH 端口非 22 时,必须加
-p 10022(示例),不加就默认连 22,连不上
为什么 ThinkPHP 启动后连不上,但命令行能连
常见于部署在 Nginx + PHP-FPM 环境时:隧道是用你个人账户启的,而 PHP-FPM 是以 www-data 或 nginx 用户运行,根本看不到那个 SSH 进程,也拿不到它的端口。
- 解决方案:用系统服务方式管理隧道,比如 systemd unit,确保它以和 PHP-FPM 相同用户或 root 启动,并监听在所有网络接口可访问的地址(仍限
127.0.0.1) - 检查 PHP 的
open_basedir或 SELinux 是否限制了 socket 连接(尤其 CentOS/RHEL) - 错误日志里出现
SQLSTATE[HY000] [2002] Connection refused,基本就是隧道没起来,或端口不匹配 - 别依赖 “启动脚本里写了 ssh 命令” 就以为万事大吉 —— 脚本可能执行成功但隧道因权限/网络失败,得单独验证进程存活
最易忽略的一点:SSH 隧道本身不感知应用层连接状态。ThinkPHP 一次请求失败不会自动重拨隧道,断连后得靠外部机制(如 systemd restart 或健康检查脚本)拉起。别把它当成“永久连接”,得当做一个需要主动保活的基础设施组件来管。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











