本文介绍如何使用PHP SDK中的sample代码,来完成创建主题、创建订阅、启动HttpEndpoint、发布消息、查看HttpEndpoint接收消息和删除主题操作。

步骤一:准备工作

  1. 下载最新版PHP SDK,解压后进入php_sdk/Samples/Topic子目录。
  2. 打开CreateTopicAndSendMessage.php文件,在文件的最下几行,配置AccessKeyId、AccessKeySecret、Endpoint,以及要推送到的HttpServer的IP地址和Port。
    • AccessKeyId、AccessKeySecret
    • Endpoint
      • 访问MNS的接入地址,请登录MNS控制台,单击右上角获取Endpoint查看。
      • 不同地域的接入地址不同。
    • IP
      • 需要是公网能访问的IP地址。
  3. 修改SDK设置。

    CreateTopicAndSendMessage的代码顶部有一些设置,在使用SDK的时候需要做同样的设置。

    // require sdk里自带的一个autoload文件即可
    require_once(dirname(dirname(dirname(__FILE__))).'/mns-autoloader.php');
    
    // 代码里需要用的一些php class
    use AliyunMNS\Client;
    use AliyunMNS\Model\SubscriptionAttributes;
    use AliyunMNS\Requests\PublishMessageRequest;
    use AliyunMNS\Requests\CreateTopicRequest;
    use AliyunMNS\Exception\MnsException;       

步骤二:创建主题

如果之前未创建过主题,那么首先需要创建主题。默认创建的主题名称是CreateTopicAndPublishMessageExample,也可以修改代码指定主题名称。

// 1. 生成一个CreateTopicRequest实例,参数传入topicName。这里可以同时传入TopicAttributes,以便在CreateTopic时同时设置自定义的Topic属性。
$request = new CreateTopicRequest($topicName);
try
{
        $res = $this->client->createTopic($request);
        echo "TopicCreated! \n";
}
catch (MnsException $e)
{
        // 2. 可能因为网络错误,或者Topic已经存在等原因导致CreateTopic失败,这里CatchException并做对应的处理
        echo "CreateTopicFailed: " . $e . "\n";
        echo "MNSErrorCode: " . $e->getMnsErrorCode() . "\n";
        return;
}           

步骤三:启动 HttpEndpoint

  • 运行http_server_sample.php启动PHP的内置HttpServer,用来接收MNS Server发送过来的HTTP request。

    php -S $ip:$port http_server_sample.php

    说明 这里的ip必须是公网能访问的IP地址。
  • 功能

    • 对MNS推送消息请求做签名验证(Samples/Topic/http_server_sample.php 中针对 Authorization 字段进行请求校验的方式不能完全规避风险,需要业务层面上设计从发送端到 HTTP Endpoint 的安全校验机制);
    • 对消息内容做MD5验证;
    • 解析推送请求的body;
    • 返回StatusCode: 200。
  • 由于http_server_sample.php的代码较多,请直接查看SDK中的源码。

步骤四:创建订阅

创建订阅以告诉MNS Server,主题里面的消息应该推送到哪里。Sample里使用的是HTTP Endpoint。

$subscriptionName = "SubscriptionExample";
// 1. 生成 SubscriptionAttributes,这里第二个参数是 Subscription 的Endpoint。
// 1.1 这里设置的是刚才启动的 http server 的地址
// 1.2 更多支持的Endpoint类型可以参考:help.aliyun.com/document_detail/27479.html
$attributes = new SubscriptionAttributes($subscriptionName, 'http://' . $this->ip . ':' . $this->port);

try
{
        $topic->subscribe($attributes);
        // 2. 订阅成功
        echo "Subscribed! \n";
}
catch (MnsException $e)
{
        // 3. 可能因为网络错误,或者同名的Subscription已存在等原因导致订阅出错,这里CatchException并做对应的处理
        echo "SubscribeFailed: " . $e . "\n";
        echo "MNSErrorCode: " . $e->getMnsErrorCode() . "\n";
        return;
}          

步骤五:发布消息

现在可以发布消息到主题中,并且期待在HttpServer上收到对应的消息。

$messageBody = "test";
// 1. 生成 PublishMessageRequest
// 1.1 如果是推送到邮箱,还需要设置 MessageAttributes,可以参照 Tests/TopicTest.php 里面的 testPublishMailMessage
$request = new PublishMessageRequest($messageBody);
try
{
        $res = $topic->publishMessage($request);
        // 2. PublishMessage成功
        echo "MessagePublished! \n";
}
catch (MnsException $e)
{
        // 3. 可能因为网络错误等原因导致 PublishMessage 失败,这里 CatchException 并做对应处理
        echo "PublishMessage Failed: " . $e . "\n";
        echo "MNSErrorCode: " . $e->getMnsErrorCode() . "\n";
        return;
}            

步骤六:查看HttpEndpoint接收消息

  • 步骤五发布了一条消息到主题中,MNS会将发布的消息推送给步骤三启动的HttpEndpoint;
  • HttpEndpoint在接收到消息推送请求后,会通过error_log打印到console。

步骤七:取消订阅

现在不需要再接收消息,可以告诉MNS Server取消订阅。

try
{
        $topic->unsubscribe($subscriptionName);
        echo "Unsubscribe Succeed! \n";
}
catch (MnsException $e)
{
        echo "Unsubscribe Failed: " . $e;
        return;
}           

步骤八:删除主题

Sample最后删除了这个测试用的主题。

try
{
        $this->client->deleteTopic($topicName);
        echo "DeleteTopic Succeed! \n";
}
catch (MnsException $e)
{
        echo "DeleteTopic Failed: " . $e;
        return;
}