需安装pdo_mysql扩展并配置MySQL监听外网:CentOS用yum install php-pdo php-mysqlnd,Ubuntu用apt install php-mysql;改bind-address=0.0.0.0,开安全组3306端口,用户授权用'%'而非'localhost',hostname填127.0.0.1或容器名等可达地址,调试时启用PDO::ERRMODE_EXCEPTION。

PHP报错 PDOException: could not find driver 怎么办
线上服务器没装 pdo_mysql 扩展,ThinkPHP 就连不上 MySQL。不是配置写错了,是根本没驱动可用。
检查方法:php -m | grep pdo 看输出里有没有 pdo_mysql;或者写个 phpinfo() 页面搜 PDO drivers。
- CentOS/Alibaba Cloud Linux:运行
yum install php-pdo php-mysqlnd(注意不是php-mysql,后者已废弃) - Ubuntu/Debian:用
apt install php-mysql,它会自动装好pdo_mysql - 重启 PHP 服务:
systemctl restart php-fpm或service apache2 restart,不重启白装
数据库连接超时或拒绝连接(Connection refused / timeout)
ThinkPHP 配置看着没问题,但连不上,大概率是服务器网络层拦住了——不是代码问题,是云厂商防火墙或 MySQL 绑定地址卡的。
先确认 MySQL 是否监听外网:netstat -tlnp | grep :3306,如果只显示 127.0.0.1:3306,说明只接受本地连接。
- 改 MySQL 配置:
bind-address = 0.0.0.0(别直接删这行,有些版本会 fallback 到 127.0.0.1) - 阿里云/腾讯云必须在安全组里放行
3306端口,且授权对象不能只写0.0.0.0/0就完事——得确认你服务器公网 IP 是出口 IP,否则可能被误判为内网访问 - 用户权限要带 host:
CREATE USER 'tp'@'%' IDENTIFIED BY 'xxx'; GRANT ALL ON db.* TO 'tp'@'%'; FLUSH PRIVILEGES;,@'localhost'不管用
ThinkPHP 数据库配置中 hostname 填什么才对
填错 hostname 是最隐蔽的连不上原因。它不是填你浏览器访问的域名,而是 PHP 进程能直接解析并到达的地址。
常见组合:
- 同服务器部署:填
127.0.0.1(别填localhost,MySQL 会走 socket,而 ThinkPHP 默认走 TCP) - Docker 容器间通信:填对方容器名(如
mysql),不是localhost,也不是宿主机 IP - 云数据库(RDS):填控制台给的内网地址(如
rm-xxx.mysql.rds.aliyuncs.com),公网地址延迟高还可能被限流 - 如果用了 CDN 或反向代理,
hostname和数据库实际位置无关,只和 PHP 所在机器的网络可达性有关
开启 debug 模式后仍看不到具体 PDO 错误
ThinkPHP 默认把 PDO 异常吞掉了,只抛出笼统的 Database Exception,真正错误被压在底层。
临时调试时,在数据库配置数组里加一项:'deploy' => 0, 'strict' => true, 'debug' => true,还不够,得手动触发 PDO 原始异常:
- 在
app/database.php的params里加上:PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION - 或者在连接建立后立刻执行:
\think\facade\Db::getPdo()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - 错误信息会变成类似:
SQLSTATE[HY000] [2002] Connection refused,比 “连接失败” 有用十倍
线上环境别留 PDO::ERRMODE_EXCEPTION,会暴露敏感路径和 SQL 结构。查完就删。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











