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

标签 php mysql wordpress google-app-engine google-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 环境中使用具有四个参数的相同连接字符串时,它会抛出错误:

警告:mysqli_connect():php_network_getaddresses:getaddrinfo 失败:名称或服务未知

GAE 环境
this question ,我被告知使用所有 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 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);
}

关于php - 使用 mysqli_connect 连接到 Google App Engine 中的 Cloud SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57683958/

相关文章:

css - Bootstrap 上的内容定位技巧

python:CommandError:您似乎没有安装 'mysql' 程序或在您的路径上

mysql - 基于另一列值的列值

php - 如何在 CodeIgniter 中仅从日期时间获取日期?

php - 如何使用 PHPSpec 和 Laravel 插入示例数据

php - Woocommerce 结构消失了

wordpress - 从我的自定义帖子类型列中删除自定义分类列

php - YouTube 错误 HTTP 429 - 请求过多

php - 如何使用动态id制作多个ajax触发器

php - Laravel 哪里没有