本文介紹使用PHP SDK發送SMQ消息時的準備工作及示例代碼。
準備工作
CreateQueueAndSendMessage.php的代碼最上方有一些設置,使用SDK時需按照注釋進行設置。
// require替換為composer下載的vendor下的autoload文件。 require_once __DIR__ . '/vendor/autoload.php'; // 代碼里需要用的一些 PHP class。 use AliyunMNS\Client; use AliyunMNS\Requests\SendMessageRequest; use AliyunMNS\Requests\CreateQueueRequest; use AliyunMNS\Exception\MnsException;
消息體編碼選擇
當消息體無特殊字符時,建議您不使用Base64編碼。
發送消息時使用
message.setMessageBodyAsRawString
方法設置消息體。接收消息時使用
meesage.getMessageBodyAsRawString
方法獲取消息體。
發送消息
完整示例代碼下載,請參見CreateQueueAndSendMessage。
// 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.生成一個SendMessageRequestItem對象。
// SendMessageRequestItem對象本身也包含了DelaySeconds和Priority屬性可以設置。
// 對于Message的屬性,請參見QueueMessage。
$bodyMD5 = md5(base64_encode($messageBody));
$request = new SendMessageRequestItem($messageBody);
try
{
$res = $queue->sendMessage($request)
// 3.消息發送成功。
echo "MessageSent! \n";
}
catch (MnsException $e)
{
// 4.可能因為網絡錯誤,或MessageBody過大等原因造成發送消息失敗,這里CatchException并做對應的處理。
echo "SendMessage Failed: " . $e;
return;
}
接收和刪除消息
完整示例代碼下載,請參見CreateQueueAndSendMessage。
$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;
}
文檔內容是否對您有幫助?