本文介紹如何使用PHP SDK建立隊列、發送訊息、接收和刪除訊息、以及刪除隊列。
步驟一:準備工作
- 下載檔案CreateQueueAndSendMessage.php。
- 開啟CreateQueueAndSendMessage.php檔案,在檔案的最下方配置AccessKeyId、AccessKeySecret和Endpoint。
- AccessKeyId、AccessKeySecret
- 訪問阿里雲API的金鑰組。
- 如果使用阿里雲帳號訪問,請登入AccessKey管理頁面建立、查看。
- 如果使用RAM使用者訪問,請登入阿里雲存取控制控制台查看。
- Endpoint
- AccessKeyId、AccessKeySecret
- 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;
}