使用 mysqli_connect 在 Google App Engine 中连接到云 SQL
Connect to Cloud SQL in Google App Engine using mysqli_connect
我正在尝试在 Google App Engine 标准环境中配置我的 Wordpress 站点。我已经为 MySQL 第二代实例配置了 Cloud SQL 并且可以使用 Cloud SQL 代理访问它。
我遇到的问题是在将应用程序部署到 Google App Engine (GAE) 环境后连接到云 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 环境
在 this question 中,我被告知使用所有 6 个可选参数调用 mysqli_connect
,参数 1 为 null
,参数 5 为 3306
,作为端口。当我尝试使用具有以下 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');
}
无论我尝试什么,我似乎都无法从 GAE mysqli_connect
连接到 CloudSQL。有人可以告诉我我做错了什么吗?谢谢。
我怀疑问题是套接字路径中的冒号阻止它识别它是绝对路径。请尝试 define('DB_HOST', '/cloudsql/<project_id:region:instance_id>');
。
一些其他提示:您可以使用 Cloud SQL proxy 在 /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);
}
我正在尝试在 Google App Engine 标准环境中配置我的 Wordpress 站点。我已经为 MySQL 第二代实例配置了 Cloud SQL 并且可以使用 Cloud SQL 代理访问它。
我遇到的问题是在将应用程序部署到 Google App Engine (GAE) 环境后连接到云 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 环境
在 this question 中,我被告知使用所有 6 个可选参数调用 mysqli_connect
,参数 1 为 null
,参数 5 为 3306
,作为端口。当我尝试使用具有以下 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');
}
无论我尝试什么,我似乎都无法从 GAE mysqli_connect
连接到 CloudSQL。有人可以告诉我我做错了什么吗?谢谢。
我怀疑问题是套接字路径中的冒号阻止它识别它是绝对路径。请尝试 define('DB_HOST', '/cloudsql/<project_id:region:instance_id>');
。
一些其他提示:您可以使用 Cloud SQL proxy 在 /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);
}