thinkphp连接远程mysql需四步:改mysql绑定地址为0.0.0.0、创建限定ip的专用用户并授权、tp5配置中hostname填公网地址且charset设为utf8mb4、开放服务器防火墙及云安全组3306端口。

直接填对 hostname、port 和网络权限,比改配置文件更容易连上外部 MySQL。
database.php 中的 hostname 和 hostport 必须指向真实外网地址
很多人把 hostname 写成 'localhost' 或 '127.0.0.1',这会让 ThinkPHP 去连本机 MySQL,而不是你真正想连的那台外部服务器。
- 外部数据库在阿里云 RDS?填它的内网或外网地址,比如
'rm-xxxx.mysql.rds.aliyuncs.com'或'47.98.x.x' - 端口别漏写 ——
hostport默认是'3306',但有些云厂商或自建库会改,比如'3307'或'63306' - 若用域名,确保 PHP 所在服务器能
ping通且 DNS 解析正常;建议先用telnet rm-xxx.com 3306测试端口连通性
MySQL 用户必须授权从远程 IP 访问
即使 ThinkPHP 配置全对,MySQL 服务端默认只允许 localhost 登录。连不上时,90% 是权限没开。
- 登录 MySQL 服务端(不是你的 PHP 服务器),执行:
CREATE USER 'tp_user'@'%' IDENTIFIED BY 'strong_pass'; - 再赋权:
GRANT SELECT,INSERT,UPDATE,DELETE ON mydb.* TO 'tp_user'@'%'; FLUSH PRIVILEGES; -
'%'表示任意来源 IP,生产环境建议缩窄到具体 IP,比如'192.168.10.50' - 检查是否启用了跳过密码验证:
skip-grant-tables会导致认证失败,但错误信息常被掩盖为“Access denied”
charset 和 prefix 不影响连接成败,但 utf8mb4 必须显式声明
连接能通不代表中文不乱码。ThinkPHP 默认用 'utf8',但 MySQL 8+ 的 utf8 实际是 utf8mb3,存 emoji 或四字节 UTF-8 字符会截断或报错。
- 务必把
charset改成'utf8mb4',同时确认 MySQL 服务端的character_set_server和库/表字符集也是utf8mb4 -
prefix留空或写准了不影响连接,但它决定后续Db::name('user')实际查的是tp_user还是user表,容易查空却不报错 - 如果外部库用的是 PostgreSQL 或 SQL Server,
type必须对应改成'pgsql'或'sqlsrv',否则框架仍会尝试用 MySQL 驱动去连,报错像PDOException: could not find driver
env() 取值失败时,default 配置会静默 fallback 到 mysql
很多项目在 config/database.php 里用 env('database.hostname', '127.0.0.1'),但忘记在 .env 里配,或 .env 文件权限不对、没被加载,结果连的还是本地库,还查不到问题。
- 运行
php think env查看当前生效的环境变量,确认database.hostname是否输出预期值 - 临时绕过 env:把
hostname直接写死成外部地址,排除变量读取问题 -
default键值必须和connections下某个 key 完全一致,比如'default' => 'prod',但connections里只有'mysql'和'test',就会 fallback 到'mysql'而不报错
最常被忽略的是 MySQL 服务端防火墙和安全组——配置全对、用户也授权了,但云服务器的安全组没放行 3306(或自定义端口),连接会卡在超时,错误日志里只显示 Connection refused 或空异常。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











