编写和响应 Pub/Sub 消息

区域 ID

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

详细了解区域 ID

Pub/Sub 可在应用之间提供可靠的多对多异步消息传递服务。发布者应用可以向某一主题发送消息,其他应用可以订阅该主题以接收消息。

本文档介绍如何使用 Cloud 客户端库在 PHP 应用中发送和接收 Pub/Sub 消息。

前提条件

  • 请按照 App Engine 上的 PHP 版“Hello, World!”中的说明设置您的环境和项目,并了解如何设计 App Engine PHP 应用的结构。
  • 记下并保存项目 ID,因为您需要用它来运行本文档中所述的示例应用。

    克隆示例应用

    将示例应用复制到本地机器,然后导航到 pubsub 目录:

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

    创建主题和订阅

    创建主题和订阅,其中包括指定 Pub/Sub 服务器应该向其发送请求的端点:

    gcloud pubsub topics create YOUR_TOPIC_NAME
    gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
        --topic YOUR_TOPIC_NAME
    

    设置环境变量

    修改 index.php 文件,为您的主题和订阅设置环境变量:

    $container->set('topic', 'php-example-topic');
    $container->set('subscription', 'php-example-subscription');

    代码审核

    示例应用使用 Cloud 客户端库

    示例应用使用您在 app.yaml 文件中设置的值来配置环境变量。推送请求处理程序使用这些值来确认请求来自 Pub/Sub 且来源可信:

    runtime: php
    env: flex
    

    示例应用维护一个全局列表以存储此实例接收的消息:

    $messages = [];
    

    pull 方法从您创建的主题中检索消息,并将消息添加到消息列表中:

    // get PULL pubsub messages
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionName);
    $pullMessages = [];
    foreach ($subscription->pull(['returnImmediately' => true]) as $pullMessage) {
        $pullMessages[] = $pullMessage;
        $messages[] = $pullMessage->data();
    }
    // acknowledge PULL messages
    if ($pullMessages) {
        $subscription->acknowledgeBatch($pullMessages);
    }

    publish 方法向主题发布新消息:

    if ($message = (string) $request->getBody()) {
        // Publish the pubsub message to the topic
        $pubsub = new PubSubClient([
            'projectId' => $projectId,
        ]);
        $topic = $pubsub->topic($topicName);
        $topic->publish(['data' => $message]);
        return $response->withStatus(204);
    }

    在本地运行示例

    在本地运行时,您可以借助 Google Cloud CLI 提供身份验证以使用 Google Cloud API。假设您按照前提条件中的说明设置了环境,那么您已经运行了 gcloud init 命令,该命令可提供此身份验证。

    使用 Composer 安装依赖项:

    composer install
    

    然后在启动应用之前设置环境变量:

    模拟推送通知

    应用可以在本地发送消息,但无法在本地接收推送消息。但是,您可以向本地推送通知端点发送 HTTP 请求来模拟推送消息。该示例包含文件 sample_message.json

    您可以使用 curlhttpie 客户端发送 HTTP POST 请求:

    响应:

    请求完成后,您可以刷新 localhost:8080 并在收到的消息列表中查看该消息。

    在 App Engine 上运行

    如需使用 gcloud 命令行工具将演示应用部署到 App Engine,请从 app.yaml 文件所在的目录运行以下命令:

    gcloud app deploy
    

    您现在可以通过 https://PROJECT_ID.REGION_ID.r.appspot.com 访问该应用。您可以使用表单提交消息,但无法保证您的哪个应用实例会收到通知。您可以发送多条消息并刷新页面,以查看收到的消息。