php - 使用 mysqli_connect 连接到 Google App Engine 中的 Cloud SQL
问题描述
我正在尝试在 Google App Engine 标准环境中配置我的 Wordpress 网站。我已经为 MySQL 第二代实例配置了 Cloud SQL,并且可以使用 Cloud SQL 代理访问它。
在将应用程序部署到 Google App Engine (GAE) 环境后,我遇到的问题是连接到 Cloud SQL 实例。这是两个不同的连接字符串;一个用于 GAE 环境,另一个用于本地环境。
if (isset($_SERVER['GAE_ENV'])) {
$dbConn = mysqli_connect (null, DB_USER, DB_PASSWORD, DB_NAME, 3306, DB_SOCK);
} else { // local environment
$dbConn = mysqli_connect (DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
}
本地环境
当我使用以下 4 个参数时,本地环境的连接字符串可以完美运行: DB_HOST
、DB_USER
、DB_PASSWORD
、DB_NAME
。当我尝试在 GAE 环境中使用具有四个参数的相同连接字符串时,会引发错误:
Warning: mysqli_connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known
GAE 环境
在这个问题中,我被告知mysqli_connect
使用所有 6 个可选参数进行调用,其中null
参数 1 和3306
参数 5 是端口。当我尝试使用带有以下 6 个参数的 GAE 连接字符串进行连接时:null
, DB_USER
, DB_PASSWORD
, DB_NAME
, 3306
, DB_SOCK
,我得到一个稍微不同的错误:
Fatal error: Uncaught mysqli_sql_exception: No such file or directory
以下是wp-config.php
根据环境设置连接字符串变量的代码:
if ($onGae) {
/** GAE Environment */
define('DB_NAME', 'database');
define('DB_HOST', ':/cloudsql/project_id:region:instance_id');
define('DB_USER', 'user');
define('DB_PASSWORD', 'password');
} else {
/** Local environment */
define('DB_NAME', 'database');
define('DB_HOST', '127.0.0.1');
define('DB_USER', 'user');
define('DB_PASSWORD', 'password');
}
无论我尝试什么,我似乎都无法mysqli_connect
从 GAE 连接到 CloudSQL。有人可以告诉我我做错了什么吗?谢谢你。
解决方案
我怀疑问题是您的套接字路径中的冒号阻止它识别它是绝对路径。试试define('DB_HOST', '/cloudsql/<project_id:region:instance_id>');
吧。
其他一些提示:您可以使用Cloud SQL 代理在 处创建本地 unix 套接字/cloudsql/<CONNECTION_NAME>
,这意味着您可以在本地测试部署的相同代码。
同样作为一般编程建议,我会尽量避免使用DB_HOST
不同类型的值(因为它们确实不一样)。这将帮助您避免在不经意间使用$DB_HOST
其他地方并期望 IP 地址。尝试这样的事情:
define('DB_NAME', 'database');
define('DB_USER', 'user');
define('DB_PASSWORD', 'password');
if ($onGae) {
/** GAE Environment */
define('DB_HOST', null);
define('DB_SOCKET', '/cloudsql/project_id:region:instance_id');
} else {
/** Local environment */
define('DB_HOST', '127.0.0.1');
define('DB_SOCKET', null);
}
推荐阅读
- macos - NSUserAutomatorTask 变量数组/列表值不能被 Automator 操作解析
- wpf - WPF XAML 将资源键绑定到属性
- android - 以编程方式更新 APK
- prometheus - Prometheus AlertManager,当指标值发生变化时向 Slack 通道发出警报
- apache - httpd 未显示/使用最新版本的 apache(通过 brew)
- python - 如何一次进行多个替换?| PYTHON
- javascript - Angular - indexOf JS 不适用于 *ngIf
- 3d - 从 vtkImageData 创建一个体积模型
- python - 如何为随机生成的数字设置超时
- typescript - 检查变量是否属于具有相同属性的 Typescript 中的自定义类型