金山云RDS必须通过内网连接,需确保PHP应用与RDS同VPC、同地域,使用控制台提供的内网地址(非域名或公网IP),并配置正确安全组与白名单;PDO连接须显式设charset=utf8mb4及ATTR_EMULATE_PREPARES=>false。

mysqli_connect() 和 PDO 都能连,但金山云数据库(Kingsoft Cloud RDS for MySQL)默认不开放公网直连,必须走内网或代理;直接填 127.0.0.1 或公网 IP 会失败。
确认实例网络与访问权限
金山云 RDS 实例默认部署在私有网络(VPC)中,PHP 应用若不在同一 VPC 内(比如本地开发机、非金山云 ECS),无法直连。常见错误现象是:Connection refused 或超时。
- 应用必须部署在金山云 ECS 上,且与 RDS 实例处于同一地域、同一 VPC;否则需申请「外网地址」——但该功能需手动开启,且存在安全风险,不建议生产环境启用
- 进入 RDS 控制台 → 实例详情页 → 「连接信息」查看「内网地址」和端口(默认
3306),别用「公网地址」字段(为空或显示“未开通”) - 检查安全组规则:确保 ECS 所属安全组放行了目标 RDS 内网 IP + 端口(如
192.168.10.23:3306)
使用 PDO 连接(推荐)
金山云 RDS 兼容标准 MySQL 协议,PDO 是最稳妥的选择。注意字符集必须显式声明为 utf8mb4,否则中文可能乱码或插入失败。
-
$dsn中的host填控制台显示的「内网地址」,不是域名或公网 IP - 务必设置
PDO::ATTR_EMULATE_PREPARES => false,否则部分高版本金山云 MySQL(如 8.0+)会报错SQLSTATE[HY000]: General error: 2025 - 示例代码片段:
$host = 'krds-xxxxxx.mysql.rds.ksc.com'; // ✅ 内网地址,非域名
$port = '3306';
$dbname = 'myapp';
$username = 'admin';
$password = 'SecurePass123';
<p>try {
$dsn = "mysql:host={$host};port={$port};dbname={$dbname};charset=utf8mb4";
$pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
} catch (PDOException $e) {
error_log('DB connect failed: ' . $e->getMessage());
die('Service unavailable');
}ThinkPHP 6.x 的 database.php 配置要点
ThinkPHP 默认读取 config/database.php,但金山云 RDS 对连接参数更敏感,容易因字段缺失或格式错位导致 SQLSTATE[HY000] [2002] 错误。
立即学习“PHP免费学习笔记(深入)”;
- 必须显式指定
'hostport' => '3306',不能省略;即使端口是默认值,框架某些版本会 fallback 到空字符串 -
'type'必须小写'mysql',写成'MySQL'或'Mysql'会导致驱动加载失败 - 避免在
'hostname'后加冒号和端口(如'krds-xxx.mysql.rds.ksc.com:3306'),应单独用'hostport'字段传 - 示例关键配置段:
return [
'type' => 'mysql',
'hostname' => 'krds-xxxxxx.mysql.rds.ksc.com',
'hostport' => '3306',
'database' => 'myapp',
'username' => 'admin',
'password' => 'SecurePass123',
'charset' => 'utf8mb4',
'prefix' => '',
];连接池与长连接问题
金山云 RDS 默认限制每个账号最大连接数(如基础版 100),而 PHP-FPM 的 pm.max_children 若设得过高,又没复用连接,很容易触发 Too many connections。
- 不要在每次请求中新建
PDO实例后不释放;框架通常自动管理,但手写脚本需注意作用域 - 禁用
PDO::ATTR_PERSISTENT(持久连接):金山云 RDS 不推荐使用,可能导致连接泄漏和状态残留 - 如果用 Swoole 或 Hyperf 等常驻内存框架,必须用连接池组件(如
hyperf/database),不能直接 new PDO - 可通过金山云控制台「监控」→「连接数」实时观察峰值,结合
show processlist排查异常连接来源
实际部署时最容易被忽略的是:RDS 实例的「白名单」设置。 即使网络通、账号对,若 ECS 内网 IP 没加进 RDS 白名单(即「IP 白名单分组」),连接仍会被拒绝,且错误提示和网络不通几乎一样。务必在 RDS 控制台「白名单设置」里添加对应 ECS 的内网网段(如 192.168.10.0/24)。



















