首页 > 解决方案 > 使用 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_HOSTDB_USERDB_PASSWORDDB_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。有人可以告诉我我做错了什么吗?谢谢你。

标签: phpmysqlwordpressgoogle-app-enginegoogle-cloud-sql

解决方案


我怀疑问题是您的套接字路径中的冒号阻止它识别它是绝对路径。试试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);
}

推荐阅读