ThinkPHP 6 的 params 是 PDO 连接参数唯一合法入口,必须置于 config/database.php 中 connections.mysql.params 数组内,类型为键值对数组,键须为带反斜杠前缀的 PDO 常量(如 \PDO::MYSQL_ATTR_SSL_CA),值为 Web 进程可读的绝对路径;SSL 配置错误、路径权限不足或 SELinux 限制均会导致静默失败或连接拒绝。

ThinkPHP 6 的 params 是 PDO 连接参数的唯一透传入口,不是可选配置项,而是启用 SSL、长连接、大小写控制等底层行为的刚性通道。
params 必须放在 connections.mysql.params 数组里
它不在 DSN 字符串中,也不在 .env 文件里,更不能在模型或查询时临时加。唯一合法位置是 config/database.php 中对应数据库连接(如 mysql)的 params 键下,类型必须是数组:
- 错误写法:
'dsn' => 'mysql:host=...;ssl_mode=REQUIRED'—— PDO 不识别 URL 里的 SSL 参数 - 错误写法:
'params' => 'PDO::MYSQL_ATTR_SSL_CA=/path/ca.pem'—— 必须是键值对,且键是常量,不是字符串 - 正确结构:
'params' => [\PDO::MYSQL_ATTR_SSL_CA => '/etc/mysql/certs/ca.pem']
SSL 配置必须用绝对路径 + PDO 常量键名
ThinkPHP 不解析证书内容,只把参数原样交给 PDO。所以路径和键名错一个就直接报连接失败(常见错误:PDOException: SQLSTATE[HY000] [2002] Connection refused 或静默超时):
-
\PDO::MYSQL_ATTR_SSL_CA、\PDO::MYSQL_ATTR_SSL_CERT、\PDO::MYSQL_ATTR_SSL_KEY必须全大写,带反斜杠前缀 - 路径必须是 Web 进程用户(如 www-data 或 nginx)可读的绝对路径,
./certs/ca.pem或public/certs/一定失败 - 自签名内网环境请用
\PDO::MYSQL_ATTR_SSL_MODE => \PDO::MYSQL_ATTR_SSL_MODE_REQUIRED;用VERIFY_IDENTITY会因域名不匹配中断连接
其他常用 params 场景与风险点
params 可承载任意 PDO 支持的连接属性,但部分参数有隐式副作用,需谨慎:
- 启用长连接:
\PDO::ATTR_PERSISTENT => true—— 但 ThinkPHP 6 默认禁用pconnect,开启后需确认 MySQL 服务端未限制 max_connections - 统一列名小写:
\PDO::ATTR_CASE => \PDO::CASE_LOWER—— 模型自动映射字段时能避免大小写不一致问题 - 禁用模拟预处理:
\PDO::ATTR_EMULATE_PREPARES => false—— 对时间类型或 JSON 字段更安全,但旧版 MySQL 可能不兼容 - 所有证书文件必须是 PEM 格式,
.pfx、.jks、.crt+key 分离但无密码才有效;带密码的 key 会导致 PDO 初始化失败且无明确报错
最易被忽略的是文件权限和 SELinux 上下文 —— 即使路径绝对、常量正确、证书有效,Web 进程没有读取权限或受限于 SELinux 策略,连接也会静默失败。建议用 php -r "var_dump(is_readable('/etc/mysql/certs/ca.pem'));" 在命令行和 Web 环境分别验证。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











