使用 mysqli_connect 连接到 Google App Engine 中的 Cloud SQL



我正在尝试在Google App Engine标准环境中配置我的Wordpress网站。 我已经为MySQL第二代实例配置了一个Cloud SQL,可以使用Cloud SQL Proxy访问它。

我遇到的问题是在应用程序部署到谷歌应用引擎(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_HOSTDB_USERDB_PASSWORDDB_NAME。 当我尝试在 GAE 环境中使用具有四个参数的相同连接字符串时,它会引发错误:

Warning: mysqli_connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known

GAE 环境
在这个问题中,我被告知使用所有 6 个可选参数调用mysqli_connect,参数 1 为null,参数 5 为3306,作为端口。 当我尝试使用具有以下 6 个参数的 GAE 连接字符串进行连接时:nullDB_USERDB_PASSWORDDB_NAME3306DB_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代理在/cloudsql/<CONNECTION_NAME>创建本地unix套接字,这意味着您可以在本地测试相同的代码。

同样作为一般编程建议,我会尽量避免对不同类型的值使用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);
}

相关内容

  • 没有找到相关文章

最新更新