[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

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 轻松测试应用程序。
我将简要总结一下步骤。

  1. 使用 Google Cloud SQL ,获取 cloud_sql_proxy 并重命名文件名。
  2. 移动到路径指定的位置(例如 Google Cloud SDK 目录)。
  3. 运行 gcloud auth 应用程序-默认登录
  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 应用程序日志 tail -s 默认值

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

 

查看错误日志

由于GAE是Paas,所以无法登录服务器并查看错误日志。

因此,部署后,要检查错误,Stackdriver Error Reporting检查日志

它很容易看到,因为它显示的内容被整齐地解析,但信息分散在各处,所以很难习惯它。

 

概括

这和我平常的开发过程有点不同,所以我经常感到困惑,但我觉得如果我一步一步地迈出一步,事情就会解决。
特别是,我发现通过代理本地连接到 Google Cloud SQL 的功能非常易于使用。

它是托管小型有用工具的完美服务,即使规模增长,它也会自动增加实例,因此可以用于多种目的。
此外,您还可以使用memcache,并且在Google Cloud Storage中创建了应用程序的目录,该目录旨在轻松处理,因此您不必担心在哪里存储各种数据。

就是这样。

如果您觉得这篇文章有帮助,请点赞!
0
加载中...
0 票,平均:0.00 / 10
1,098
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

写这篇文章的人

关于作者

万代洋一

我的主要工作是为社交游戏开发 Web API,但我也很幸运能够做很多其他工作,包括营销。
此外,我在 Beyond 中的肖像权被视为 CC0。