本文介绍如何使用PHP SDK创建主题、创建队列、创建订阅和发布消息等操作。

步骤一:准备工作

  1. 下载文件CreateTopicAndPushMessageToQueue
  2. 打开CreateTopicAndPushMessageToQueue.php文件,在文件中最下方配置以下内容:
  3. 修改SDK设置。

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

    //require SDK里自带的一个autoload文件。
    require __DIR__ . '/vendor/autoload.php';
    
    //代码里需要用的一些PHP class。
    use AliyunMNS\Client;
    use AliyunMNS\Exception\MessageNotExistException;
    use AliyunMNS\Model\SubscriptionAttributes;
    use AliyunMNS\Requests\PublishMessageRequest;
    use AliyunMNS\Requests\CreateTopicRequest;
    use AliyunMNS\Requests\CreateQueueRequest;
    use AliyunMNS\Exception\MnsException;      

步骤二:创建主题

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

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

步骤三:创建队列

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

// 生成一个CreateQueueRequest对象。CreateQueueRequest还可以接受一个QueueAttributes参数,用来初始化生成的queue的属性。
// 对于queue的属性,请参见Queue。
$request = new CreateQueueRequest($queueName);
try {
    $res = $this->client->createQueue($request);
    echo "QueueCreated! \n";
} catch (MnsException $e) {
    // 可能因为网络错误,或者Queue已经存在等原因导致CreateQueue失败,这里CatchException并做对应的处理。
    echo "CreateQueueFailed: " . $e;
    return;
}

步骤四:创建订阅

对已创建的主题进行订阅。

$subscriptionName = "SubscriptionExample";
$attributes = new SubscriptionAttributes($subscriptionName, $topic->generateQueueEndpoint($queueName), 'BACKOFF_RETRY', 'SIMPLIFIED');
try {
    $topic->subscribe($attributes);
    echo "Subscribed! \n";
} catch (MnsException $e) {
    // 可能因为网络错误,或者同名的Subscription已存在等原因导致订阅出错,这里CatchException并做对应的处理。
    echo "SubscribeFailed: " . $e;
    return;
}

步骤五:发布消息

发布消息到主题中。

$messageBody = "test";
$request = new PublishMessageRequest(base64_encode($messageBody));
try {
    $res = $topic->publishMessage($request);
    echo "MessagePublished! \n";
} catch (MnsException $e) {
    // 可能因为网络错误等原因导致PublishMessage失败,这里CatchException并做对应处理。
    echo "PublishMessage Failed: " . $e;
    return;
}

步骤六:从队列接收和删除消息

消息从主题推送到队列后,从队列中取出并删除该条消息。

try {
    // 调用receiveMessage函数进行消息的拉取。
    // waitSeconds非0表示这次receiveMessage是一次http long polling,如果queue内没有message,那么这次request会在server端等到queue内有消息才返回。最长等待时间为waitSeconds的值,最大为30。
    $res = $queue->receiveMessage(3);
    echo "Receive Message success, MessageBody: " . $res->getMessageBody() . "\n";

    // 这里是您处理消息的逻辑。Sample里就直接略过这一步。
    // 如果这里发生了程序崩溃或卡住等异常情况,对应的Message会在VisibilityTimeout之后重新可见,从而可以被其他进程处理,避免消息丢失。

    // 获取ReceiptHandle,这是一个有时效性的Handle,可以用来设置Message的各种属性和删除Message。更多信息,请参见QueueMessage。
    $receiptHandle = $res->getReceiptHandle();
    // 消息已经处理完成,从队列里删除这条消息。
    $queue->deleteMessage($receiptHandle);
    echo "DeleteMessage Succeed! \n";
    break;
} catch (MessageNotExistException $e) {
    echo "No New Message";
} catch (MnsException $e) {
    echo "Process Failed: " . $e;
}

步骤七:删除订阅

删除测试用的订阅。

 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;
}         

步骤九:删除队列

删除测试用的队列。

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