繁体   English   中英

使用 mysqli_connect() 将 Wordpress 连接到 Google App Engine 上的 Cloud SQL

[英]Using mysqli_connect() for Wordpress connection to Cloud SQL on Google App Engine

我正在尝试在 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

在这个社区教程中有使用 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  

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

看起来您可能将信息错误地传入mysqli_connect 如果您查看它的文档,它实际上需要 6 个参数: hostusernamepasswddbnameportsocket

在主机下,您可以阅读以下内容:

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

在套接字下,它阐明它应该是套接字路径:

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

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

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

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

查看此文档:

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

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

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

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

然而,最初的问题还提到我试图让连接为 Wordpress 安装工作。 这两个区域提供了与本教程相关的附加信息,这些信息是关于如何在 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 ,而且还必须为Wordpress安装定义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 环境中工作。 此套接字需要是mysqli_connect的最后一个(第 6 个)参数,第一个参数指定为null ,这会强制连接使用套接字。

花了一些时间来排序,但最终使用上面的这些设置让它工作。 我想知道是否还有其他人有过像我在 Google App Engine 标准环境中获取 Wordpress 以连接到用于 MySQL 第二代实例的 Cloud SQL 那样复杂的经历。 我希望这些评论对某人有所帮助。

你最好使用 wpdb 类。 Wpdb 是一个 WordPress 数据库访问抽象类。 查看此文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM