[英]Connect to Cloud SQL in Google App Engine using mysqli_connect
[英]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 个参数: host
、 username
、 passwd
、 dbname
、 port
、 socket
。
在主机下,您可以阅读以下内容:
将 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_HOST
、 DB_USER
、 DB_PASSWORD
、 DB_NAME
。 将应用程序部署到 Google App Engine 后, mysqli_connect
必须使用所有六个参数: DB_HOST
、 DB_USER
、 DB_PASSWORD
、 DB_NAME
、 DB_PORT
、 DB_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.