You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何PHP PDO通过公网IP连接Google Cloud MySQL报getaddrinfo failed错误?

问题排查结论

首先明确:通过公网IP连接Google Cloud MySQL不需要强制使用Cloud SQL Auth Proxy,你本地mysql客户端可以正常连通已经证明网络授权、实例公网访问配置都是正常的,问题出在PHP代码语法层面。

故障根因

PHP的字符串解析规则导致:你定义PDO DSN参数时使用了单引号包裹字符串,而PHP不会解析单引号字符串内的$开头变量,因此实际传给PDO的主机地址是字面量字符串$dbhost,而非你提前赋值的公网IP地址,系统尝试解析$dbhost这个不存在的域名时触发getaddrinfo failed报错。

修复方案

将DSN的单引号替换为双引号即可,双引号包裹的字符串会自动解析内部变量,修复后的代码如下:

<?php
 try {
$dbhost = '35.x.x.x';
$dbuser = 'root';
$dbpass = 'xxxx';
$dbase = 'xxxx';

$connConfig = [
    PDO::ATTR_TIMEOUT => 5,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]; 

// 把原单引号换成双引号即可解析内部变量
$conn = new PDO("mysql:host=$dbhost; dbname=$dbase", $dbuser, $dbpass, $connConfig);
}catch (PDOException $e){
 echo "Error!: " . $e->getMessage() . "<br/>";
 die();
 }
 
?>

如果担心变量解析歧义,也可以使用字符串拼接写法:

$conn = new PDO('mysql:host='.$dbhost.'; dbname='.$dbase, $dbuser, $dbpass, $connConfig);

可选检查项

  • 如果你修改过MySQL实例的默认端口,需要在DSN中显式补充port参数:mysql:host=$dbhost;port=你的自定义端口;dbname=$dbase
  • 确认代码中填写的数据库名、用户名、密码和mysql客户端连接时使用的参数一致

内容的提问来源于stack exchange,提问作者rajesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:27:02