全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
消息服务

主题使用手册

更新时间:2017-06-07 13:26:11

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

1. 准备

  • 下载最新版php sdk,解压后进入php_sdk/Samples/Topic子目录;
  • 打开CreateTopicAndSendMessage.php文件,在文件的最下几行,配置AccessKeyID、AccessKeySecret,Endpoint,以及要推送到的HttpServer的IP和Port;
    • AccessKeyId、AccessKeySecret
    • Endpoint
      • 访问MNS的接入地址,登陆MNS控制台 单击右上角 获取Endpoint 查看;
      • 不同地域的接入地址不同;
    • ip
      • 需要是公网能访问的IP
  • CreateTopicAndSendMessage的代码顶部有一些设置,在使用SDK的时候需要做同样的设置
  1. // require sdk里自带的一个autoload文件即可
  2. require_once(dirname(dirname(dirname(__FILE__))).'/mns-autoloader.php');
  3. // 代码里需要用的一些php class
  4. use AliyunMNS\Client;
  5. use AliyunMNS\Model\SubscriptionAttributes;
  6. use AliyunMNS\Requests\PublishMessageRequest;
  7. use AliyunMNS\Requests\CreateTopicRequest;
  8. use AliyunMNS\Exception\MnsException;

2. 创建主题

  • 如果之前未创建过主题(Topic),那么首先需要创建Topic。默认创建的Topic名称是 CreateTopicAndPublishMessageExample,也可以修改代码指定Topic名称;
  1. // 1. 生成一个CreateTopicRequest实例,参数传入topicName。这里可以同时传入TopicAttributes,以便在CreateTopic时同时设置自定义的Topic属性。
  2. $request = new CreateTopicRequest($topicName);
  3. try
  4. {
  5. $res = $this->client->createTopic($request);
  6. echo "TopicCreated! \n";
  7. }
  8. catch (MnsException $e)
  9. {
  10. // 2. 可能因为网络错误,或者Topic已经存在等原因导致CreateTopic失败,这里CatchException并做对应的处理
  11. echo "CreateTopicFailed: " . $e . "\n";
  12. echo "MNSErrorCode: " . $e->getMnsErrorCode() . "\n";
  13. return;
  14. }

3. 启动 HttpEndpoint

  • 运行 http_server_sample.php 启动 PHP的内置HttpServer,用来接收MNS Server发送过来的http request;
  • 具体命令:php -S $ip:$port http_server_sample.php 这里的IP必须是公网能访问的IP

  • 功能

    • 对 MNS 推送消息请求做签名验证;
    • 对消息内容做MD5验证;
    • 解析推送请求的 body;
    • 返回StatusCode: 200;
  • 由于 http_server_sample.php 的代码较多,请直接查看sdk 中的源码。

4. 创建订阅

  • 创建订阅以告诉MNS Server,Topic里面的消息应该推送给谁
  • Sample里使用的是Http的Endpoint
  1. $subscriptionName = "SubscriptionExample";
  2. // 1. 生成SubscriptionAttributes,这里第二个参数是Subscription的Endpoint。
  3. // 1.1 这里设置的是刚才启动的http server的地址
  4. // 1.2 更多支持的Endpoint类型可以参考:help.aliyun.com/document_detail/27479.html
  5. $attributes = new SubscriptionAttributes($subscriptionName, 'http://' . $this->ip . ':' . $this->port);
  6. try
  7. {
  8. $topic->subscribe($attributes);
  9. // 2. 订阅成功
  10. echo "Subscribed! \n";
  11. }
  12. catch (MnsException $e)
  13. {
  14. // 3. 可能因为网络错误,或者同名的Subscription已存在等原因导致订阅出错,这里CatchException并做对应的处理
  15. echo "SubscribeFailed: " . $e . "\n";
  16. echo "MNSErrorCode: " . $e->getMnsErrorCode() . "\n";
  17. return;
  18. }

5. 发布消息

  • 现在我们可以发布消息到Topic中,并且期待在HttpServer上收到对应的消息。
  1. $messageBody = "test";
  2. // 1. 生成PublishMessageRequest
  3. // 1.1 如果是推送到邮箱,还需要设置MessageAttributes,可以参照Tests/TopicTest.php里面的testPublishMailMessage
  4. $request = new PublishMessageRequest($messageBody);
  5. try
  6. {
  7. $res = $topic->publishMessage($request);
  8. // 2. PublishMessage成功
  9. echo "MessagePublished! \n";
  10. }
  11. catch (MnsException $e)
  12. {
  13. // 3. 可能因为网络错误等原因导致PublishMessage失败,这里CatchException并做对应处理
  14. echo "PublishMessage Failed: " . $e . "\n";
  15. echo "MNSErrorCode: " . $e->getMnsErrorCode() . "\n";
  16. return;
  17. }

6. 查看 HttpEndpoint 接收消息

  • 第5步发布了一条消息到Topic中,MNS 会将发布的消息推送给第3步启动的 HttpEndpoint;
  • HttpEndpoint 在接收到消息推送请求后,会通过error_log打印到console;

7. 取消订阅

  • 现在我们不需要再接收消息啦,可以告诉MNS Server取消订阅
  1. try
  2. {
  3. $topic->unsubscribe($subscriptionName);
  4. echo "Unsubscribe Succeed! \n";
  5. }
  6. catch (MnsException $e)
  7. {
  8. echo "Unsubscribe Failed: " . $e;
  9. return;
  10. }

8. 删除主题

  • Sample中,我们最后删除了这个测试用的Topic
  1. try
  2. {
  3. $this->client->deleteTopic($topicName);
  4. echo "DeleteTopic Succeed! \n";
  5. }
  6. catch (MnsException $e)
  7. {
  8. echo "DeleteTopic Failed: " . $e;
  9. return;
  10. }
本文导读目录