本文介绍如何使用PHP SDK中的sample代码,来完成创建主题、创建订阅、启动HTTP Endpoint和发布消息等操作。
步骤一:准备工作
- 下载最新版PHP SDK,解压后进入aliyun-mns-php-sdk-master/Samples/Topic子目录。
- 打开CreateTopicAndSendMessage.php文件,在文件中最下方配置以下内容:
- AccessKey ID、AccessKey Secret
- 访问阿里云API的密钥对。
- 如果使用阿里云账号访问,请登录AccessKey管理页面创建和查看。
- 如果使用RAM用户访问,请登录阿里云访问控制控制台查看。
- Endpoint
- 访问消息服务MNS的接入地址,请登录MNS控制台,单击右上角获取Endpoint查看。
- 不同地域的接入地址不同。
- AccessKey ID、AccessKey Secret
- 修改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;
步骤三:启动HTTP Endpoint
- 运行http_server_sample.php启动PHP的内置HTTP Server,用来接收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,即步骤三的HTTP Server的地址。详细说明,请参见Subscription。
$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;
}
步骤五:发布消息
现在可以发布消息到主题中,并且期待在HTTP Server上收到对应的消息。
$messageBody = "test";
// 1.生成PublishMessageRequest。如果是推送到邮箱,还需要设置MessageAttributes,可以参照Tests/TopicTest.php里面的testPublishMailMessage。
$request = new PublishMessageRequest($messageBody);
try
{
$res = $topic->publishMessage($request);
// 2.发布消息成功。
echo "MessagePublished! \n";
}
catch (MnsException $e)
{
// 3.可能因为网络错误等原因导致PublishMessage失败,这里CatchException并做对应处理。
echo "PublishMessage Failed: " . $e . "\n";
echo "MNSErrorCode: " . $e->getMnsErrorCode() . "\n";
return;
}
步骤六:查看HTTP Endpoint接收消息
- 步骤五发布了一条消息到主题中,消息服务MNS会将发布的消息推送给步骤三启动的HTTP Endpoint。
- HTTP Endpoint在接收到消息推送请求后,会通过error_log打印到console。
步骤七:取消订阅
不需要再接收消息,可以在MNS Server取消订阅。
try
{
$topic->unsubscribe($subscriptionName);
echo "Unsubscribe Succeed! \n";
}
catch (MnsException $e)
{
echo "Unsubscribe Failed: " . $e;
return;
}
步骤八:删除主题
最后删除测试用的主题。
try
{
$this->client->deleteTopic($topicName);
echo "DeleteTopic Succeed! \n";
}
catch (MnsException $e)
{
echo "DeleteTopic Failed: " . $e;
return;
}