为何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
相关产品推荐
相关产品推荐

