我正在尝试在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_HOST
、DB_USER
、DB_PASSWORD
、DB_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 连接字符串进行连接时: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代理在/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);
}