使用 PHP 构建应用

区域 ID

REGION_ID 是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r 包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。

详细了解区域 ID

了解如何使用 PHP 7.4 或 8.1 版在 App Engine 中构建应用。该示例应用允许用户将他们喜爱图书的书名、作者、说明、出版日期和图片发布到网页上。 该应用将文本数据存储在 Cloud SQL 数据库中,将图片存储在 Cloud Storage 存储桶中。

指南结构

  1. 使用 Google Cloud CLI 创建 Google Cloud 项目

  2. 下载示例应用

  3. 使用 composer.json 指定依赖项

  4. 初始化应用并定义前端控制器

  5. 与 Google Cloud 服务集成

  6. 为 App Engine 配置应用

  7. 部署应用

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build API.

    Enable the API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Build API.

    Enable the API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. 安装 PHP 依赖项管理工具 Composer。在 Linux 和 Mac OS X 系统上,您必须全局安装 Composer

下载示例应用

  1. GitHub 上浏览代码

  2. 下载或克隆应用。

    git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git

    或者下载该示例的 zip 文件并解压缩。

  3. 导航到 getting-started 目录。

    cd php-docs-samples/appengine/standard/getting-started

使用 composer.json 指定依赖项

该应用使用前端控制器来对请求进行路由处理。本指南中的示例代码使用 Slim 框架,但您可以任选一个 Web 框架。

  1. 打开 composer.json 文件,查看所有直接依赖项:

    {
      "require": {
        "google/cloud-storage": "^1.6",
        "slim/slim": "^4.0",
        "slim/psr7": "^1.0",
        "slim/twig-view": "^3.0",
        "php-di/slim-bridge": "^3.1",
        "symfony/yaml": "^5.2"
      },
      "autoload": {
         "psr-4": {
           "Google\\Cloud\\Samples\\AppEngine\\GettingStarted\\": "src"
         }
      }
    }
    
  2. 如需安装依赖项并生成 composer.lock 文件,请运行以下命令:

    composer install
    

    composer.lock 文件可帮助您的应用检索在多个构建和环境中使用的相同版本的软件包。

初始化应用并定义前端控制器

index.php 文件会初始化应用,并将所有请求转发至 ./src/controllers.php 文件中定义的控制器。


// Use the composer autoloader to load dependencies.
require_once __DIR__ . '/vendor/autoload.php';

//  Load the application code.
/** @var Slim\App $app */
$app = require __DIR__ . '/src/app.php';
require __DIR__ . '/src/controllers.php';

// Bootstrap the slim framework to handle the request.
$app->run();

如需详细了解请求处理,请参阅应用启动处理请求

与 Google Cloud 服务集成

App Engine 需要应用与外部系统集成才能存储数据。 示例应用将文本数据与图片分别存储在 Cloud SQLCloud Storage 中。

请参阅选择存储选项页面了解所有 Google Cloud 存储选项。

使用 Cloud SQL

在示例应用中,用户将图书发布到网页。应用使用 Cloud SQL 数据库来存储图书的书名、作者、出版日期和说明。

您需要先创建一个 Cloud SQL 实例,然后才能将内容添加到应用的数据库。

创建 Cloud SQL 实例

使用 gcloud CLI 创建 Cloud SQL 实例:

gcloud sql instances create INSTANCE_NAME --tier=MACHINE_TYPE --region=REGION

例如,如果要将实例命名为 bookshelf 并在美国中央区域使用机器类型 db-n1-standard-2

gcloud sql instances create bookshelf --tier=db-n1-standard-2 --region=us-central1

设置 MySQL 根用户

您可以使用 gcloud CLI 设置 Cloud SQL 实例的根用户密码:

gcloud sql users set-password USER --host=HOST --instance=INSTANCE_NAME --password=PASSWORD

例如,如果您想将 Cloud SQL 实例 bookshelf 的根用户密码设置为 passw0rd!

gcloud sql users set-password root --host=% --instance=bookshelf --password=passw0rd!

在 Cloud SQL 实例上设置数据库

要存储图书的作者、书名、出版日期和说明,请创建一个 MySQL 数据库:

gcloud sql databases create DATABASE_NAME --instance=INSTANCE_NAME

例如,如果要在 Cloud SQL 实例 bookshelf 上创建名为 book-data 的数据库:

gcloud sql databases create book-data --instance=bookshelf

连接到 Cloud SQL 数据库

示例应用使用 PHP 的 PDO 与 MySQL 数据库交互。

// Fill the variables below to match your Cloud SQL configuration.
// $dbConn = 'YOUR_CLOUDSQL_CONNECTION_NAME';
// $dbName = 'YOUR_CLOUDSQL_DATABASE_NAME';
// $dbUser = 'YOUR_CLOUDSQL_USER';
// $dbPass = 'YOUR_CLOUDSQL_PASSWORD';
$dsn = "mysql:unix_socket=/cloudsql/{$dbConn};dbname={$dbName}";
$pdo = new PDO($dsn, $dbUser, $dbPass);

对于本教程,在下方的配置应用部分中,这些参数指定为环境变量。

查询单行

当用户点击图书时,应用会查询数据库并返回包含图书书名、作者、出版日期和说明的单行内容。

$statement = $pdo->prepare('SELECT * FROM books WHERE id = :id');
$statement->bindValue('id', $id, PDO::PARAM_INT);
$statement->execute();
$result = $statement->fetch(PDO::FETCH_ASSOC);

使用 Cloud Storage

示例应用使用 Cloud Storage 来存储用户上传的图片(二进制文件)。

创建 Cloud Storage 存储桶

Cloud Storage 使用存储桶来组织数据并控制其访问权限。

使用 gcloud CLI 创建 Cloud Storage 存储桶:

gcloud storage buckets create gs://BUCKET_NAME/ --location=BUCKET_REGION

例如,如果您想在 us-central1 区域中创建名为 picture-storage 的存储桶:

gcloud storage buckets create gs://picture-storage/ --location=us-central1
  • 如果创建成功,您会看到以下输出:

    Creating gs://BUCKET_NAME/
  • 如果创建不成功,您可能会看到以下输出:

    ServiceException: 409 Bucket BUCKET_NAME already exists

    请使用其他存储桶名称重试。

将项目连接到 Cloud Storage 存储桶

要使用 Cloud Storage,您需要指定 Cloud Storage 库

use Google\Cloud\Storage\StorageClient;

存储图片

创建了 Cloud Storage 存储桶并设置好连接后,现在您就可以存储图片了。上传的图片可采用预定义的访问控制列表 (ACL),以控制对图片的访问权限。

在此示例应用中,上传的图片将采用预定义的 ACL public-read。您可以通过 Cloud Storage 对象的 mediaLink 属性获取其公共网址。您可以在 HTML 图片标记中使用此网址。

// Set your own image file path and content type below to upload an
// image to Cloud Storage.
// $imageStream = fopen('/path/to/your_image.jpg', 'r');
// $imageContentType = 'image/jpg';
$object = $bucket->upload($imageStream, [
    'metadata' => ['contentType' => $imageContentType],
    'predefinedAcl' => 'publicRead',
]);
$imageUrl = $object->info()['mediaLink'];

如需关于私有 Cloud Storage 对象读取方式的说明,请参阅“下载对象”页面

删除映像

当用户从应用中删除图书时,以下代码会从 Cloud Storage 存储分区中删除该图片。

$object = $bucket->object($objectName);
$object->delete();

配置应用

您可以使用 app.yaml 文件配置在 App Engine 上运行的应用,该文件用于指定应用的运行时、环境变量和其他设置。

对于配置要求最低的应用,app.yaml 文件可能只有一行:

PHP 8.1

runtime: php81

PHP 7.4

runtime: php74

您可以将其他配置选项和特定于应用的环境变量添加到 app.yaml 配置文件中。

添加环境变量

app.yaml 文件中将环境配置提供给应用。本指南中使用的 bookshelf 示例需要将配置作为环境变量提供,以便应用了解如何连接到正确的 Cloud SQL 实例和 Cloud Storage 存储桶。

要部署您的应用,您需要修改 app.yaml 配置文件:

# See https://cloud.google.com/appengine/docs/standard/php/config/appref for a
# complete list of `app.yaml` directives.

runtime: php81

env_variables:
    GOOGLE_STORAGE_BUCKET: ""
    # populate these to use the "mysql" or "postres" backends
    CLOUDSQL_CONNECTION_NAME: ""
    CLOUDSQL_USER: ""
    CLOUDSQL_PASSWORD: ""
    ## Uncomment to give your database a name other than "bookshelf"
    # CLOUDSQL_DATABASE_NAME: ""
  1. GOOGLE_STORAGE_BUCKET 变量设置为您的 Cloud Storage 存储分区的名称。

  2. CLOUDSQL_CONNECTION_NAME 变量设置为 app-name:region:instance-name 您可以使用以下 gcloud 命令检索必要的详细信息:

    gcloud sql instances describe INSTANCE

    对于 Cloud SQL 第二代实例,CLOUDSQL_CONNECTION_NAME 将采用以下格式:your_project_name:your_region:your_instance

  3. 如果您已创建的数据库的名称不是 bookshelf,则取消备注并设置 CLOUD_SQL_DATABASE_NAME 变量。在此示例中,创建了名称为 book-data 的数据库。

  4. 查看您的 app.yaml 文件,该文件应如下所示:

PHP 8.1

runtime: php81

env_variables:
  GOOGLE_STORAGE_BUCKET: picture-storage
  CLOUDSQL_CONNECTION_NAME: sample-application:us-central1:bookshelf
  CLOUDSQL_USER: root
  CLOUDSQL_PASSWORD: passw0rd!
  CLOUDSQL_DATABASE_NAME: book-data

PHP 7.4

runtime: php74

env_variables:
  GOOGLE_STORAGE_BUCKET: picture-storage
  CLOUDSQL_CONNECTION_NAME: sample-application:us-central1:bookshelf
  CLOUDSQL_USER: root
  CLOUDSQL_PASSWORD: passw0rd!
  CLOUDSQL_DATABASE_NAME: book-data

部署应用

  1. 要部署应用,请导航到 getting-started 目录并运行以下命令:

    gcloud app deploy
  2. 出现位置提示时,请选择应用用户附近的位置。 App Engine 是区域级的,这意味着运行您应用的基础架构位于特定的地理区域。例如,本教程使用 us-central1 区域来部署其存储资源。在同一区域中部署应用可缩短延迟时间并提升性能。

    通常最好选择用户附近的位置,但在有些情况下,建议在资源所在位置附近部署您的应用。了解可用的 App Engine 位置资源位置

  3. 要查看应用,请运行以下命令:

    gcloud app browse

清理

删除您的 Google Cloud 项目,停止对该项目中使用的资源进行结算。

要删除项目,请运行以下命令:

gcloud projects delete PROJECT_ID

要验证该项目已删除,请列出您的项目:

gcloud projects list

后续步骤