65.9K
CodeProject 正在变化。 阅读更多。
Home

Google App Engine - PHP 教程

2014年11月26日

CC (Attr 3U)

12分钟阅读

viewsIcon

14829

在本教程结束时,您将实现一个可工作的应用程序,一个简单的留言簿,允许用户将消息发布到公共留言板。

引言

欢迎使用 Google App Engine!创建 App Engine 应用程序很容易,只需几分钟。而且它免费开始:立即上传您的应用程序并与用户分享,无需付费,无需承诺。

Google App Engine 应用程序可以用 PHP、Java、Python 或 Go 编程语言编写。本教程涵盖 PHP。如果您更愿意使用 Java、Python 或 Go 来构建您的应用程序,请参阅 JavaPython 2.7Go 指南。

在本教程中,您将学习如何

  • 构建一个使用 PHP 的 App Engine 应用程序
  • 将 App Engine 应用程序与 Google 帐户集成以进行用户身份验证
  • 使用 Google Cloud SQL 存储您的数据
  • 将您的应用上传到 App Engine

在本教程结束时,您将实现一个可工作的应用程序,一个简单的留言簿,允许用户将消息发布到公共留言板。

准备工作

在继续之前,您需要下载 Google App Engine PHP SDK,其中包含一个模拟 App Engine 环境的 Web 服务器应用程序,以及将您的应用程序部署到 App Engine 生产环境的工具。请按照您操作系统的说明进行操作,然后回来继续!

PHP 运行时目前作为实验性预览功能提供。请注意,在服务正式可用之前,API 和服务可能会发生变化。

让我们从实现一个显示短消息的小应用程序开始。

Hello, World!

PHP 运行时目前作为实验性预览功能提供。请注意,在服务正式可用之前,API 和服务可能会发生变化。让我们开始实现一个显示简短消息的微型应用程序。

创建简单的脚本

创建一个名为 helloworld 的目录。此应用程序的所有文件都将驻留在此目录中。

helloworld 目录内,创建一个名为 helloworld.php 的文件,并为其赋予以下内容

<?php
  echo 'Hello, World!';

此 PHP 脚本会响应所有请求,并显示消息 Hello, world!

创建配置文件

App Engine 应用程序有一个名为 app.yaml 的配置文件。除其他事项外,此文件描述了应为哪些 URL 使用哪些处理程序脚本。

helloworld 目录内,创建一个名为 app.yaml 的文件,并赋予其以下内容

application: helloworld
version: 1
runtime: php
api_version: 1

handlers:
- url: /.*
  script: helloworld.php

从上到下,此配置文件描述了此应用程序的以下内容

  • 应用程序标识符是 helloworld。App Engine 上的每个新应用程序都有一个唯一的应用程序标识符。您将在下一步注册应用程序时选择应用程序的标识符。在那之前,您可以将此处的值保留为 helloworld,因为在本地开发时,此值并不重要。
  • 这是此应用程序代码的第 1 个版本。如果您在上传新版本应用程序软件之前进行调整,App Engine 将保留以前的版本,并允许您使用管理控制台回滚到以前的版本。
  • 此代码运行在 php 运行时环境,版本为 "1"。未来可能支持其他运行时环境和语言。
  • 匹配正则表达式 /.* (所有 URL) 的 URL 的所有请求都应由 helloworld.php 脚本处理。

此文件的语法是 YAML。有关配置选项的完整列表,请参阅 app.yaml 参考

测试应用程序

有了处理程序脚本和将每个 URL 映射到处理程序的配置文件,应用程序就完成了。您现在可以使用 App Engine SDK 附带的 Web 服务器对其进行测试。

如果您使用 Google App Engine Launcher,可以通过选择 文件 菜单,然后选择 添加现有应用程序...,再选择 helloworld 目录来设置应用程序。在应用程序列表中选择该应用程序,然后点击 运行 按钮启动应用程序,然后点击 浏览 按钮查看它。点击 浏览 按钮会在您的默认 Web 浏览器中加载(或重新加载)https://:8080/

如果您没有使用 Google App Engine Launcher,请使用以下命令启动 Web 服务器,并提供 helloworld 目录的路径

google_appengine/dev_appserver.py helloworld/

Web 服务器现在正在运行,正在监听端口 8080 上的请求。您可以通过在 Web 浏览器中访问以下 URL 来测试应用程序

有关运行开发 Web 服务器的更多信息,包括如何更改其使用的端口,请参阅 开发 Web 服务器参考,或运行带有 --help 选项的命令。

您现在拥有了一个完整的 App Engine 应用程序!您可以立即部署这个简单的问候语,并与世界各地的用户共享。但在部署之前,让我们更深入地了解一些更有趣的 App Engine 功能。

使用用户服务

PHP 运行时目前作为实验性预览功能提供。请注意,在服务正式可用之前,API 和服务可能会发生变化。

Google App Engine 提供基于 Google 基础架构的多个实用服务,应用程序可以通过 SDK 中包含的库进行访问。其中一项服务是 Users 服务,它允许您的应用程序与 Google 用户帐户集成。借助 Users 服务,您的用户可以使用他们已有的 Google 帐户登录您的应用程序。

让我们使用 Users 服务来个性化此应用程序的问候语。

使用用户

再次编辑 helloworld/helloworld.php,并将其内容替换为以下内容

<?php

use google\appengine\api\users\User;
use google\appengine\api\users\UserService;
# Looks for current Google account session
$user = UserService::getCurrentUser();
if ($user) {
  echo 'Hello, ' . htmlspecialchars($user->getNickname());
}
else {
  header('Location: ' . UserService::createLoginURL($_SERVER['REQUEST_URI']));
}

重新加载浏览器中的页面。您的应用程序会将您重定向到本地版本的 Google 登录页面,该页面适用于测试您的应用程序。您可以在此屏幕上输入任何您喜欢的用户名,您的应用程序将看到基于该用户名的伪 User 对象。

当您的应用程序在 App Engine 上运行时,用户将被定向到 Google 帐户登录页面,然后在成功登录或创建帐户后重定向回您的应用程序。

用户 API

让我们仔细看看新部分

# Looks for current Google account session
$user = UserService::getCurrentUser();

如果用户已登录您的应用程序,getCurrentUser() 将返回用户的 User 对象。否则,它将返回 null

if ($user) {
  echo 'Hello, ' . htmlspecialchars($user->getNickname());
}

如果用户已登录,则显示个性化消息,使用与用户帐户关联的昵称。

else {
  header('Location: ' . UserService::createLoginURL($_SERVER['REQUEST_URI']));
}

如果用户未登录,则将用户的浏览器重定向到 Google 帐户登录屏幕。重定向会包含指向此页面的 URL(通过包含 $_SERVER['REQUEST_URI']),因此在用户登录或注册新帐户后,Google 帐户登录机制会将用户发送回此处。

有关 Users API 的更多信息,请参阅 Users 参考

我们的应用程序现在可以按名称问候访问用户。让我们添加一项功能,让用户可以互相问候。

处理表单

PHP 运行时目前作为实验性预览功能提供。请注意,在服务正式可用之前,API 和服务可能会发生变化。

如果我们希望用户能够发布他们自己的问候语,我们需要一种方法来处理用户通过 Web 表单提交的信息。PHP 使处理表单数据变得容易。

处理 Web 表单

helloworld/helloworld.php 的内容替换为以下内容

<html>
  <body>
    <?php
    if (array_key_exists('content', $_POST)) {
      echo "You wrote:<pre>\n";
      echo htmlspecialchars($_POST['content']);
      echo "\n</pre>";
    }
    ?>
    <form action="/sign" method="post">
      <div><textarea name="content" rows="3" cols="60"></textarea></div>
      <div><input type="submit" value="Sign Guestbook"></div>
    </form>
  </body>
</html>

重新加载页面以查看表单,然后尝试提交消息。

提交表单时,应用程序会收到一个使用 HTTP POST 方法(method="post")的请求,PHP 通过 $_POST 超全局变量使 POST 的表单变量可用。

让我们更仔细地看看表单是如何处理的

if (array_key_exists('content', $_POST)) {
  echo "You wrote:<pre>\n";
  echo htmlspecialchars($_POST['content']);
  echo "\n</pre>";
}

在显示消息(存储在 <textarea name="content" 中)之前,应用程序会检查它是否存在于 $_POST 超全局变量中。如果存在,则消息中的特殊 HTML 字符(如 "<")会使用 htmlspecialchars 函数替换为相应的 HTML 实体(如 &lt;)。

每个 Web 应用程序通过模板或其他机制从应用程序代码返回动态生成的 HTML。大多数 Web 应用程序还需要提供静态内容,例如图像、CSS 样式表或 JavaScript 文件。为了提高效率,App Engine 会以不同于应用程序源代码和数据文件的方式处理静态文件。您可以使用 App Engine 的静态文件功能为此应用程序提供 CSS 样式表。

使用静态文件

与传统的 Web 托管环境不同,Google App Engine 不会直接从您的应用程序源代码目录提供文件,除非配置为这样做。

但是,在许多情况下,您希望直接向 Web 浏览器提供静态文件。图像、CSS 样式表、JavaScript 代码、电影和 Flash 动画通常都存储在 Web 应用程序中,并直接提供给浏览器。您可以指示 App Engine 直接提供特定文件,而无需编写自己的处理程序。

使用静态文件

编辑 helloworld/app.yaml 并将其内容替换为以下内容

application: helloworld
version: 1
runtime: php
api_version: 1

handlers:
- url: /stylesheets
  static_dir: stylesheets

- url: /.*
  script: helloworld.php

新的 handlers 部分为 URL 定义了两个处理程序。当 App Engine 收到以 /stylesheets 开头的 URL 请求时,它会将路径的其余部分映射到 stylesheets 目录中的文件,如果找到相应的文件,则会将文件的内容返回给客户端。所有其他 URL 匹配 /.* 路径,并由 helloworld.php 脚本处理。

默认情况下,App Engine 使用基于文件名扩展名的 MIME 类型提供静态文件。例如,扩展名为 .css 的文件名将被提供 MIME 类型 text/css。您可以在 app.yaml配置处理程序时,使用 mime_type 设置来显式配置 MIME 类型。

URL 处理程序路径模式按它们在 app.yaml 中的出现顺序进行测试,从上到下。在这种情况下,对于相应路径,/stylesheets 模式将先于 /.* 模式匹配。有关 URL 映射和其他可以在 app.yaml 中指定的选项的更多信息,请参阅 app.yaml 参考

创建 helloworld/stylesheets 目录。在此新目录中,创建一个名为 main.css 的新文件,并赋予其以下内容

body {
  font-family: Verdana, Helvetica, sans-serif;
  background-color: #DDDDDD;
}

最后,编辑 helloworld/helloworld.php 并在顶部的 <html> 行之后插入以下几行

<head>
  <link type="text/css" rel="stylesheet" href="https://cloud.google.com/stylesheets/main.css" />
</head>

重新加载浏览器中的页面。新版本使用了样式表。

现在是时候向世界展示您完成的应用程序了。

上传您的应用程序

PHP 运行时目前作为实验性预览功能提供。请注意,在服务正式可用之前,API 和服务可能会发生变化。

您可以使用 Google Developers Console 创建和管理 App Engine 应用程序。注册应用程序 ID 后,您将使用 SDK 提供的命令行工具 appcfg.py 将其上传到您的网站。

注意:应用程序 ID 必须以字母开头。注册应用程序 ID 后,您可以删除它,但无法在删除后重新注册同一个应用程序 ID。如果您现在不想注册 ID,可以跳过接下来的步骤。

注意:如果您拥有 App Engine Premier 帐户,则可以指定您的新应用程序应位于欧盟而不是美国。没有 Premier 帐户的开发者需要 填写此表格 并为应位于欧盟的应用程序 启用结算

在欧盟托管应用程序特别有用,如果您的用户更靠近欧洲而非美国。网络延迟更少,并且最终用户内容将在欧盟内静态存储。您必须在注册应用程序时,在“位置选项”部分点击“编辑”链接来指定此位置;之后无法更改。

注册应用程序

您可以通过以下 URL 从 Developers Console 创建和管理 App Engine 应用程序

https://console.developers.google.com/

使用您的 Google 帐户登录 App Engine。如果您没有 Google 帐户,可以 创建一个 Google 帐户,其中包含电子邮件地址和密码。

注意:您可能已经使用 Google Developers Console 创建了一个项目。如果是这种情况,则不必创建新应用程序。您的项目有标题和 ID。在接下来的说明中,可以在提及应用程序标题和 ID 的任何地方使用项目标题和 ID。它们是相同的。

要创建新应用程序,请点击“创建应用程序”按钮。按照说明注册一个应用程序 ID,这是此应用程序的唯一名称。如果您选择使用免费的 appspot.com 域名,则应用程序的完整 URL 将是 http://your_app_id.appspot.com/。您也可以为您的应用程序购买顶级域名,或使用您已有的域名。

编辑 app.yaml 文件,然后将 application: 设置的值从 helloworld 更改为您注册的应用程序 ID。

如果您的应用程序使用 Google Cloud SQL 进行数据存储(PHP 入门教程中的任何示例都不包含此内容),则您还必须 请求一个 Google Cloud SQL 实例

上传应用程序

您可以通过几种方式将完成的应用程序上传到 Google App Engine。

通过命令行上传

运行以下命令

    appcfg.py update helloworld/

在提示时输入您的 Google 用户名和密码。

使用 App Engine Launcher

您也可以使用 Google App Engine Launcher 的界面上传您的应用程序。只需在 Launcher 中选择项目,然后点击 部署

使用 Git

如果您使用 Git 版本控制系统,您可以在 Google 的云中创建远程存储库,并配置您的开发环境,以便每次将其推送到该存储库时部署代码的最新版本。请参阅 使用 Git 推送和部署

您现在可以看到您的应用程序正在 App Engine 上运行。如果您设置了免费的 appspot.com 域名,则您的网站 URL 将以您的应用程序 ID 开头

http://your_app_id.appspot.com

恭喜!

您已完成本教程。有关此处涵盖主题的更多信息,请参阅 App Engine 文档的其余部分。

除非另有说明,本页的代码示例根据 Apache 2.0 许可证 授权。

© . All rights reserved.