Codeigniter 4部署GCloud App Engine后连接Cloud MySQL超时问题
解决Codeigniter部署在GAE连接Cloud MySQL超时问题
核心问题分析
你的配置存在两个关键错误:
- 驱动与DSN不兼容:使用
MySQLi驱动却配置了PDO风格的DSN,MySQLi驱动无法识别该DSN,会忽略它转而使用hostname+port走TCP连接。 - 连接方式混用:同时配置了Unix Socket的DSN和公网IP的hostname,导致驱动优先尝试TCP连接公网IP,而GAE环境下直接连公网IP容易因网络限制或白名单问题超时。
正确配置方案
方案一:Unix Socket连接(GAE标准环境推荐)
这种方式无需公网IP,也不需要配置IP白名单,稳定性更高。
- 修改Codeigniter数据库配置:
public $default = [ 'hostname' => 'localhost', 'username' => 'username', 'password' => 'password', 'database' => 'db_name', 'DBDriver' => 'MySQLi', 'DBPrefix' => 'tbl', 'pConnect' => false, 'DBDebug' => (ENVIRONMENT !== 'production'), 'charset' => 'utf8mb4', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', 'encrypt' => false, 'compress' => false, 'strictOn' => false, 'failover' => [], 'port' => 3306, 'socket' => '/cloudsql/project:region:instance', // 替换为你的Cloud SQL实例ID ];
- 在
app.yaml中添加Cloud SQL实例配置:
beta_settings: cloud_sql_instances: "project:region:instance" # 与上面socket路径的实例ID一致
方案二:TCP公网连接(仅当必须使用时)
如果一定要用公网IP连接,需确保以下几点:
- 启用Cloud SQL实例的公网IP,并将GAE的出口IP添加到Cloud SQL的白名单(GAE标准环境出口IP是动态的,推荐使用VPC peering或Cloud SQL Auth Proxy替代)。
- 修改数据库配置,启用加密(公网连接强制要求):
public $default = [ 'hostname' => '你的Cloud SQL公网IP', 'username' => 'username', 'password' => 'password', 'database' => 'db_name', 'DBDriver' => 'MySQLi', 'DBPrefix' => 'tbl', 'pConnect' => false, 'DBDebug' => (ENVIRONMENT !== 'production'), 'charset' => 'utf8mb4', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', 'encrypt' => true, // 公网连接必须启用加密 'compress' => false, 'strictOn' => false, 'failover' => [], 'port' => 3306, ];
额外排查项
- 确认Cloud SQL实例处于运行中状态
- 验证数据库用户名/密码正确,且该用户有权限从当前连接方式访问(Unix Socket对应
localhost权限,TCP对应白名单IP权限) - 检查
app.yaml中的Cloud SQL实例ID与配置中的完全一致
内容的提问来源于stack exchange,提问作者user3682119
相关产品推荐
相关产品推荐

