全部產品
Search
文件中心

:隊列使用手冊

更新時間:Jul 02, 2024

本文介紹如何使用PHP SDK建立隊列、發送訊息、接收和刪除訊息、以及刪除隊列。

步驟一:準備工作

  1. 下載檔案CreateQueueAndSendMessage.php
  2. 開啟CreateQueueAndSendMessage.php檔案,在檔案的最下方配置AccessKeyId、AccessKeySecret和Endpoint。
  3. CreateQueueAndSendMessage的代碼最上方有一些設定,使用SDK的時候進行同樣的設定。
    //require SDK裡內建的一個autoload檔案。
    require __DIR__ . '/vendor/autoload.php';
    
    // 代碼裡需要用的一些php class。
    use AliyunMNS\Client;
    use AliyunMNS\Requests\SendMessageRequest;
    use AliyunMNS\Requests\CreateQueueRequest;
    use AliyunMNS\Exception\MnsException;

步驟二:建立隊列

如果之前未建立隊列,那麼首先需要建立隊列。預設建立的隊列名稱是CreateQueueAndSendMessageExample,也可以修改代碼指定隊列名稱。

// 1.首先初始化一個client。
$this->client = new Client($this->endPoint, $this->accessId, $this->accessKey);

// 2.產生一個CreateQueueRequest對象。CreateQueueRequest還可以接受一個QueueAttributes參數,用來初始化產生的queue的屬性。
// 對於queue的屬性,請參見Queue。
$request = new CreateQueueRequest($queueName);
try
{
        $res = $this->client->createQueue($request);
        // 3.建立隊列成功。
        echo "QueueCreated! \n";
}
catch (MnsException $e)
{
        // 4.可能因為網路錯誤,或者Queue已經存在等原因導致CreateQueue失敗,這裡CatchException並做對應的處理。
         echo "CreateQueueFailed: " . $e;
         return;
}            

步驟三:發送訊息

建立隊列後,發送訊息到隊列。

// 1.首先擷取Queue的執行個體。
// PHP SDK預設會對發送的訊息做Base64 Encode,對接收到的訊息做Base64 Decode。
// 如果不希望SDK做這樣的Base64操作,可以在getQueueRef的時候,傳入參數$base64=FALSE。即$queue = $this->client->getQueueRef($queueName, FALSE);
$queue = $this->client->getQueueRef($queueName);

$messageBody = "test";
// 2.產生一個SendMessageRequest對象。
// SendMessageRequest對象本身也包含了DelaySeconds和Priority屬性可以設定。
// 對於Message的屬性,請參見QueueMessage。
$bodyMD5 = md5(base64_encode($messageBody));
$request = new SendMessageRequest($messageBody);
try
{
        $res = $queue->sendMessage($request)
        // 3.訊息發送成功。
        echo "MessageSent! \n";
}
catch (MnsException $e)
{
        // 4.可能因為網路錯誤,或MessageBody過大等原因造成發送訊息失敗,這裡CatchException並做對應的處理。
        echo "SendMessage Failed: " . $e;
        return;
}            

步驟四:接收和刪除訊息

隊列裡已經有了一條訊息,現在可以嘗試接收訊息。

NextVisibleTime是Message ServiceMNS的訊息的一個重要屬性。更多資訊,請參見QueueMessage

$receiptHandle = NULL;
try
{
        // 1.直接調用receiveMessage函數。
        // receiveMessage函數接受waitSeconds參數,無特殊情況建議設定為30。
        // waitSeconds非0表示這次receiveMessage是一次http long polling,如果queue內沒有message,那麼這次request會在server端等到queue內有訊息才返回。最長等待時間為waitSeconds的值,最大為30。
        $res = $queue->receiveMessage(30);
        echo "ReceiveMessage Succeed! \n";
        if (strtoupper($bodyMD5) == $res->getMessageBodyMD5())
        {
             echo "You got the message sent by yourself! \n";
        }
        // 2.擷取ReceiptHandle,這是一個有時效性的Handle,可以用來設定Message的各種屬性和刪除Message。更多資訊,請參見QueueMessage。
        $receiptHandle = $res->getReceiptHandle();
}
catch (MnsException $e)
{
        // 3.和CreateQueue和SendMessage一樣,ReceiveMessage也有可能出錯,所以加上CatchException並做對應的處理。
        echo "ReceiveMessage Failed: " . $e;
        return;
}

// 這裡是您處理訊息的邏輯。Sample裡就直接略過這一步。
// 如果這裡發生了程式崩潰或卡住等異常情況,對應的Message會在VisibilityTimeout之後重新可見,從而可以被其他進程處理,避免訊息丟失。

// 4.訊息已經處理完成,從隊列裡刪除這條訊息。
try
{
        // 5.直接調用deleteMessage。
        $res = $queue->deleteMessage($receiptHandle);
        echo "DeleteMessage Succeed! \n";
}
catch (MnsException $e)
{
        // 6.這裡CatchException並做異常處理。
        // 如果是receiptHandle已經到期,那麼ErrorCode是MessageNotExist,表示通過這個receiptHandle已經找不到對應的訊息。
        // 為了保證receiptHandle不到期,VisibilityTimeout的設定需要保證足夠訊息處理完成。並且在訊息處理過程中,也可以調用changeMessageVisibility這個函數來延長訊息的VisibilityTimeout時間。
        echo "DeleteMessage Failed: " . $e;
        return;
}            

步驟五:刪除隊列

Sample裡最後會刪除這個測試隊列。

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