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() 函数(它们实际上并未定义)。
我们还悄悄添加了一个处理程序项,但如果没有它,URL 将无法识别,所以我们将创建一个名为 /test 的 URL。
安全项与 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 的应用程序。以下
是步骤的简要概述。
- 使用 Google Cloud SQL获取 cloud_sql_proxy 并重命名文件名”一文。
- 转到路径中的位置(例如,Google Cloud SDK 目录)。
- 运行 gcloud auth application-default 登录
- OAuth 身份验证页面将显示在浏览器中,请选择已登录用户并允许其访问。
-
运行 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
