【问题标题】:Using mysqli_connect() for Wordpress connection to Cloud SQL on Google App Engine使用 mysqli_connect() 将 Wordpress 连接到 Google App Engine 上的 Cloud SQL
【发布时间】:2019-12-30 05:15:12
【问题描述】:

我正在尝试在 Google App Engine 标准环境中运行 Wordpress。我已经为 MySQL 第二代实例配置了 Cloud SQL,并且可以使用 Cloud SQL 代理通过以下命令访问它:

cloud_sql_proxy  -instances=my_project_id:us-central1:my_project=tcp:3306

wp-config.php 文件:

if (isset($_SERVER['GAE_ENV'])) {
    define('DB_HOST', ':/cloudsql/my_project_id:us-central1:my_project'); 
} else {
    define('DB_HOST', '127.0.0.1'); 
}

最后,我使用这个连接到数据库:

$dbConn = mysqli_connect (DB_HOST, DB_USER, DB_PASSWORD) or die (mysqli_error($dbConn));
mysqli_select_db($dbConn, DB_NAME) or die(mysqli_error($dbConn));

此设置可在本地开发环境(即 Cloud Shell)中完美运行。该网站运行,我能够查询数据库和插入记录等。当我使用google app deploy 部署到my_project_id.appspot.com 时出现问题。该网站运行,但当我尝试查询数据库时收到此错误:

Warning: mysqli_connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /srv/wp-content/themes/mytheme/system/db.php on line 14 

第14行是$dbConn = mysqli_connect (DB_HOST, DB_USER, DB_PASSWORD) 所以我猜mysqli一定不喜欢指定DB_HOST的格式,即:/cloudsql/my_project_id:us-central1:my_project

Community Tutorial 中有一个示例代码,它使用 unix 套接字和 PDO 连接到数据库。我不知道我是否应该将这些行添加到 app.yaml 文件以及使用这个不同连接字符串的人。

env_variables:
  MYSQL_DSN: mysql:unix_socket=/cloudsql/my_project_id:us-central1:my_project;dbname=my_dbname
  MYSQL_USER: username
  MYSQL_PASSWORD: password  

对于这个冗长的问题,我深表歉意,但我想提供尽可能多的信息。有人知道我做错了什么吗?谢谢。

【问题讨论】:

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


    【解决方案1】:

    通过 Cloud Shell,您的环境已全部正确设置,以便直接连接到 Cloud SQL。在 AppEngine 中,还需要执行一些其他步骤才能进行连接。

    查看此文档:

    https://cloud.google.com/sql/docs/mysql/connect-app-engine

    它应该能让你启动并运行。

    【讨论】:

    • 我需要添加这种格式的服务帐户吗?服务-[YOUR_PROJECT_NUMBER]@gae-api-prod.google.com.iam.gserviceaccount.com
    • 对于代理,是的。名称格式与帐户无关,只与您授予它的角色/权限无关。
    • 所以我已经这样做了,添加了一个具有适当角色/权限的服务帐户。事实上,我又做了一次,并添加了另一个具有相同角色/权限的服务帐户。我不明白的是服务帐户如何与 GAE 项目相关联?我看不出它们是如何联系在一起的。
    • 哦,我认为我的一位同事发现了这个问题。 HOST 应该始终是 localhost(在 mysql_connect() 调用中为空)。然后,您需要将套接字参数传递给该调用。我们说话时他正在输入答案。
    • 谢谢@GabeWeiss。我尝试了 Kurtisvg 给我的建议,但没有奏效,所以我在这里创建了一个新问题:stackoverflow.com/questions/57683958/…
    【解决方案2】:

    您似乎将信息错误地传递到mysqli_connect。如果你看一下documentation,它实际上有6个参数:hostusernamepasswddbnameportsocket

    在host下,可以阅读以下内容:

    将 NULL 值或字符串“localhost”传递给此参数,假定为本地主机。如果可能,将使用管道而不是 TCP/IP 协议。

    在socket下,明确说明应该是socket路径:

    指定应该使用的套接字或命名管道。

    所以你需要像这样调用mysqli_connect:

    mysqli_connect (null, "user", "password", "database", 3306, "/cloudsql/<INSTANCE_CONNECTION_NAME>")
    

    【讨论】:

    • 感谢 Kurtis 的建议。我认为你在做某事,但我还没有走出困境。我尝试了您的建议来引用 mysqli_connect 的所有 6 个可选参数,但我仍然无法连接。我创建了一个新问题,可以更好地解释我的连接问题的当前状态。新问题在这里:stackoverflow.com/questions/57683958/…
    【解决方案3】:

    @Kurtisvg 的回答是绝对正确的,因为这是使用mysqli_connect 连接到 Cloud SQL 的正确格式:

    mysqli_connect (null, DB_USER, DB_PASSWORD, DB_NAME, 3306, "/cloudsql/<INSTANCE_CONNECTION_NAME>")
    

    然而,最初的问题还提到我试图让连接为 Wordpress 安装工作。这两个领域提供了与此 tutorial 有关如何在 Google App Engine 标准上运行 Wordpress 的附加信息。

    1.指定正确的 mysqli_connect() 参数
    在本地开发环境中测试应用只需要mysqli_connect使用这四个参数:DB_HOSTDB_USERDB_PASSWORDDB_NAME。将应用程序部署到 Google App Engine 后,mysqli_connect 必须使用所有六个参数:DB_HOSTDB_USERDB_PASSWORDDB_NAMEDB_PORTDB_SOCK。这是 db.php 中提供正确参数的代码,具体取决于环境:

    if (isset($_SERVER['GAE_ENV'])) {
        $dbConn = mysqli_connect (null, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT, DB_SOCK); 
    } else {  // local environment
        $dbConn = mysqli_connect (DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 
        }
    

    2。在 wp-config.php 中指定正确的 Wordpress 配置
    我发现,为了使Wordpress 正常运行,不仅需要在mysqli_connect() 中定义和使用套接字DB_SOCK,而且我还必须为@987654341 定义一个DB_HOST @ 安装。这是在我的 wp-config.php 文件中起作用的配置:

    define('DB_USER', 'user');
    define('DB_PASSWORD', 'password');
    define('DB_NAME', 'database');
    define('DB_PORT', 3306);    
    
    // Check for Google App Engine Environment
    if (isset($_SERVER['GAE_ENV'])) {
        $onGae = true;
        define('DB_HOST', ':/cloudsql/<INSTANCE_CONNECTION_NAME>'); 
        define('DB_SOCK', '/cloudsql/<INSTANCE_CONNECTION_NAME>');
    } else {
        $onGae = false;
        define('DB_HOST', '127.0.0.1'); 
    }
    

    在上面的代码中,DB_HOST 的变量需要一个完整的冒号: 在套接字的开头。此DB_HOST 变量在GAE 环境中不用作mysqli_connect 的连接参数之一。这个变量似乎确实在 Wordpress 的其他地方使用(例如 setup-config.php),这就是需要定义它的原因。 DB_SOCK 的变量不需要全冒号 : 即可在 GAE 环境中工作。这个socket需要是mysqli_connect的最后一个(第6个)参数,第一个参数指定为null,强制连接使用socket。

    花了一些时间才对它进行排序,但最终使用上面的这些设置让它工作。我想知道是否有其他人像我在 Google App Engine 标准环境中使用 Wordpress 连接到 Cloud SQL for MySQL 第二代实例时遇到过如此复杂的经历。我希望这些 cmets 对某人有所帮助。

    【讨论】:

      【解决方案4】:

      你最好使用 wpdb 类。 Wpdb 是一个 WordPress 数据库访问抽象类。看看这个documentation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-08
        相关资源
        最近更新 更多