【问题标题】:Connect to Cloud SQL in Google App Engine using mysqli_connect使用 mysqli_connect 连接到 Google App Engine 中的 Cloud SQL
【发布时间】:2019-08-28 01:26:19
【问题描述】:

我正在尝试在 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 环境
this question 中,我被告知使用所有6 个可选参数调用mysqli_connect,其中null 用于参数1,3306 用于参数5,作为端口。当我尝试使用具有以下 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。有人可以告诉我我做错了什么吗?谢谢。

【问题讨论】:

  • 就像尝试一样...在 GAE 环境中将 DB_HOST 更改为 'localhost' 并确认您收到相同的错误消息(消除一些容易敲掉的东西)。跨度>
  • 谢谢加布。我尝试了将 DB_HOST 更改为 localhost 的建议,但是当我这样做时,我得到一个“建立数据库连接时出错”。这是有道理的,因为如果不指定 ':/cloudsql/project_id:region:instance_id',它将不知道要连接到哪个数据库。我假设您告诉我要更改 wp-config.php 文件中的 DB_HOST 条目,而不是 mysqli_connect 调用中的条目,对吧?
  • 不,那很好。由于某种原因,我想确认“文件丢失”不是套接字。该错误通常意味着数据库不可用(现在不是 Cloud SQL,我们说的是它下面的 MySQL 数据库)。我今天出差了,我看看能不能也戳人看看。

标签: php mysql wordpress google-app-engine google-cloud-sql


【解决方案1】:

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

【讨论】:

  • 感谢@kurtisvg,您的回答很准确。我必须配置一些 Wordpress 特有的额外内容。这些附加步骤如下所示:*.com/questions/57650687/…
最近更新 更多