Google App Engine 上的 PHP 的 Hello World
目录
你好。
我是Mandai,负责Wild 开发团队。
Google App Engine(以下简称GAE)是一个功能强大的Paas,但是有很多事情在上手之前不了解就无法进行。
比如app.yaml怎么写,可以使用什么功能,首先是否可以使用框架,URL应该是什么。
而且SDK和gcloud命令的开发速度很快,我有时会因为无法使用我研究的命令进行部署而想放弃。
因此,基于目前最新的GAE环境(2017/03/22),我将尝试部署一个类似Hello World的程序并感受一下流程。
由于篇幅限制,我将假设安装了最新的 gcloud 命令来继续讨论。
创建app.yaml
创建适当的目录并创建 app.yaml。
app.yaml是配置程序环境的配置文件。
在 app.yaml 中,我们首先包含执行环境。
# app.yaml # 必填字段运行时:php55
我们选择PHP5.5作为执行环境。
或者更确切地说,GAE似乎除了PHP5.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->准备('插入`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' => '已注册!', );<!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 的简单注册表单页面。
该程序中使用了以下数据库表。
创建表 `forms` ( `id` int(10) unsigned NOT NULL AUTO_INCRMENT, `subject` varchar(255) DEFAULT NULL, `content` text, `created_at` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE= InnoDB默认字符集=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,则可以无需考虑任何事情就可以连接到DB。
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 应用程序-默认登录
- 浏览器中将显示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 应用程序日志 tail -s 默认值
如上所示,显示了访问的路径和响应代码,因此可以进行简单的错误检查。
查看错误日志
由于GAE是Paas,所以无法登录服务器并查看错误日志。
因此,部署后,要检查错误,Stackdriver Error Reporting检查日志
它很容易看到,因为它显示的内容被整齐地解析,但信息分散在各处,所以很难习惯它。
概括
这和我平常的开发过程有点不同,所以我经常感到困惑,但我觉得如果我一步一步地迈出一步,事情就会解决。
特别是,我发现通过代理本地连接到 Google Cloud SQL 的功能非常易于使用。
它是托管小型有用工具的完美服务,即使规模增长,它也会自动增加实例,因此可以用于多种目的。
此外,您还可以使用memcache,并且在Google Cloud Storage中创建了应用程序的目录,该目录旨在轻松处理,因此您不必担心在哪里存储各种数据。
就是这样。