Google App Engine 上的 PHP Hello World

大家好,
我是Mandai,Wild团队负责开发工作的成员。

Google App Engine(以下简称 GAE)是一个功能强大的 PaaS,但在开始使用之前,您需要了解很多事情才能上手。

例如,如何编写 app.yaml 文件、有哪些可用函数、是否可以使用框架以及 URL 是什么等等。
此外,SDK 和 gcloud 命令的开发速度如此之快,以至于当你无法使用查找到的命令进行部署时,你可能会感到沮丧,甚至想要放弃

因此,考虑到目前(2017/03/22)最新的 GAE 环境,我将尝试部署一个 Hello World 类型的程序,并掌握整个过程。

由于篇幅限制,我们将假设已安装最新的 gcloud 命令。

 

创建 app.yaml

创建一个合适的目录并创建 app.yaml 文件。

app.yaml 是一个配置文件,用于设置程序环境。

在 app.yaml 中,我们将首先进入执行环境。

# app.yaml # 必填字段 runtime: php55

我选择了 PHP 5.5 作为执行环境。
实际上,在 GAE 上似乎除了 PHP 5.5 之外没有其他选项。

 

写出来源

这次,我们将实现 Hello World 程序,但简单地说“echo "hello world";”没什么意思,所以我们将创建一个使用 Google SQL 的简单程序。

我们来创建一个名为form.php的文件。
我已经准备好了以下源代码。

<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = getenv('MYSQL_USER'); $password = getenv('MYSQL_PASSWORD'); $dsn = getenv('MYSQL_DSN'); $subject = isset($_POST['subject']) ? $_POST['subject'] : null; $content = isset($_POST['content']) ? $_POST['content'] : null; if (!empty($dsn) && !empty($username) && !empty($password) && !is_null($subject) && !is_null($content)) { $db = new PDO($dsn, $username, $password); $stmt = $db-> prepare('INSERT INTO `forms` (`subject`, `content`, `created_at`) VALUES (?, ?, ?)'); $data = array( $subject, $content, date('Ymd H:i:s'), ); if (!$stmt->execute($data)) { $info = array( 'title' => $stmt->errorCode(), 'body' => $stmt->errorInfo(), ); } else { $info = array( 'title' => 'info', 'body' => 'Successfully Signed Up!', ); } } }?><!doctype html><html><head><title>测试表</title><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"></head><body><div class="container"><?php if (isset($info)){?><div class="panel panel-default alert alert-info"><div class="panel-heading"><?php echo $info['title'] ?></div><div class="panel-body"><?php echo $info['body'] ?></div></div><?php } ?><form method="POST"><div class="form-group"><label for="subject">标题</label><input id="subject" type="text" class="form-control" name="subject"></div><div class="form-group"><label for="content">正文</label><textarea id="content" class="form-control" name="content" rows="10"></textarea></div><button class="btn btn-default">发送</button></form></div></body></html>

这是一个使用 Twitter Bootstrap 构建的简单注册表单页面。

本程序中使用的数据库表如下:

CREATE TABLE `forms` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `subject` varchar(255) DEFAULT NULL, `content` text, `created_at` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

由于我们将使用 Google Cloud SQL,因此您需要 Google Cloud SQL 的登录信息。如果您使用的用户不是 root 用户,请提前创建该用户。
虽然可以直接在源代码中写入此信息,但我们将使用 app.yaml 配置文件。

# app.yaml # 添加到您之前创建的 app.yaml 文件中 env_variables: MYSQL_DSN: mysql:unix_socket=/cloudsql/[实例连接名称];dbname=[要使用的数据库模式名称] MYSQL_USER: [MySQL 登录用户名] MYSQL_PASSWORD: [MySQL 登录密码] # 同时添加 URL 路由处理程序: - url: /test script: form.php secure: always

`env_variables` 字段允许您以类似于定义常量的方式注册它们。
要在 PHP 端获取这些值,您可以使用 `getenv()` 函数(它们实际上并未定义)。

另外,我偷偷添加了一个名为“handlers”的字段,但如果没有它,URL 将无法识别,所以我创建了一个名为“/test”的 URL。
“secure”字段与使用 HTTPS 相关,并提供以下选项。

总是

仅使用 HTTPS(通过 HTTP 访问时会重定向)

选修的

可通过 HTTP 和 HTTPS 访问

绝不

仅可通过 HTTP 访问

 

在本地环境中检查操作情况

在 GAE 上编写源代码并进行测试很麻烦,而且一旦运行开始,就会变得相当困难,因此也提供了一种在本地环境中进行测试的方法。

运行 gcloud SDK 中包含的 Python 脚本 `dev_appserver.py` 将启动一个本地服务器,并允许您测试其功能,但此时它似乎无法正确连接到 Cloud SQL。
不过,如后文所述,使用 `cloud_sql_proxy` 无需任何其他配置即可连接到数据库。

dev_appserver.py 包含在 Google Cloud SDK 中,可以通过指定 app.yaml 所在目录的路径(可以使用相对路径)作为参数来执行。

对于 Windows 系统,它安装在相当深的目录中,因此一种解决方案是将路径设置为 Google Cloud SDK 可执行文件所在的目录。

 

使用 cloud_sql_proxy 从本地开发环境连接到 Google Cloud SQL

虽然您无法使用与生产环境相同的 app.yaml 文件从本地环境连接到 Cloud SQL,但您可以使用名为 cloud_sql_proxy 的独立工具轻松地从本地计算机测试 Cloud SQL 应用程序。以下
是步骤的简要概述。

  1. 使用 Google Cloud SQL 的,我获取了 cloud_sql_proxy 文件并将其重命名。
  2. 转到路径中的位置(例如,Google Cloud SDK 目录)。
  3. 运行 gcloud auth application-default 登录
  4. OAuth 身份验证页面将显示在浏览器中,请选择已登录用户并允许其访问。
  5. 运行 cloud_sql_proxy。参考网址:https://cloud.google.com/sql/docs/mysql/sql-proxy#flags
    [适用于 Windows 系统] cloud_sql_proxy.exe -instances=[实例连接名称]=tcp:3306

如果您使用多个用户,命令可能会略有不同(主要是 gcloud auth 命令),但我无法确定,因为我没有测试过。
此工具无需向 Cloud SQL 注册连接源的 IP 地址,因此设置完成后,开发工作将变得更加轻松。

 

部署

有一个 gcloud 命令可用于部署到 GAE,因此请在 app.yaml 所在的目录中运行以下命令。

gcloud 应用部署

如果已经部署,系统会要求您确认,但在大多数情况下,应该可以顺利部署。

此外,如果 app.yaml 中注册了任何此时未路由的处理程序,则会显示以下警告。

警告:URL 路径“/hogehoge”已被保留,将不会被匹配。.

在这种情况下,即使您按原样部署,运行程序的 URL 也不会设置,因此您需要对其进行调整。

 

查看访问日志

虽然存在轻微的时间延迟,但可以通过 gcloud 命令从本地环境查看访问日志。

gcloud app logs tail -s default

如上所示,显示了访问路径和响应代码,从而可以进行简单的错误检查。

 

查看错误日志

由于 GAE 是一个 PaaS 平台,因此您无法登录服务器并查看错误日志。

因此,为了在部署后检查错误,Stackdriver 错误报告您应该使用

数据整理和显示得井井有条,易于阅读,但信息分散在各处,因此需要一些时间来适应。

 

概括

开发流程与以往略有不同,所以我经常感到困惑,但我觉得只要一步一步来,应该就能应付。
尤其让我感到方便的是,能够通过代理从本地机器连接到 Google Cloud SQL。

它非常适合托管小型便捷工具,即使项目规模扩大,它也会自动增加实例数量,并提供诸多便捷功能,使其适用于各种用途。
此外,它还支持 memcache,在 Google Cloud Storage 中创建应用程序目录以便于管理,并旨在为各种类型的数据提供便捷的存储。

就这样。

如果您觉得这篇文章对您有帮助,请点个“赞”!
0
加载中...
0票,平均分:0.00/10
1,306
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

万代洋一

我的主要工作是开发社交游戏的Web API,但幸运的是,我也有机会参与其他各种任务,包括市场营销。
我在Beyond中的图像版权采用CC0协议。