このトピックでは、PHP 用 Simple Message Queue(SMQ) SDK を使用してキューのメッセージを管理するための前提条件とサンプルコードについて説明します。
前提条件
PHP 用 SMQ SDK がインストールされていること。詳細については、「PHP 用 SDK のインストール」をご参照ください。
エンドポイントとアクセス認証情報が構成されていること。 詳細については、「エンドポイントとアクセス認証情報の構成」をご参照ください。
CreateQueueAndSendMessage.php ファイルの先頭のコメントに基づいて設定が変更されていること。
// composer によってダウンロードされた vendor ディレクトリにある autoload.php ファイルのパスで値を置き換えます。 require_once __DIR__ . '/vendor/autoload.php'; // 必要な PHP クラスを宣言します。 use AliyunMNS\Client; use AliyunMNS\Requests\SendMessageRequest; use AliyunMNS\Requests\CreateQueueRequest; use AliyunMNS\Exception\MnsException;
メッセージ本文のエンコード方式を選択する
メッセージ本文に特殊文字が含まれていない場合は、Base64 エンコードを使用しないことをお勧めします。
メッセージを送信するには、
message.setMessageBodyAsRawStringメソッドを使用してメッセージ本文を設定します。メッセージを受信するには、
message.getMessageBodyAsRawStringメソッドを使用してメッセージ本文を取得します。
メッセージを送信する
完全なサンプルコードについては、「CreateQueueAndSendMessage.php」をご参照ください。
// 1. キューを取得します。
// デフォルトでは、PHP 用 SMQ SDK は、送信メッセージに対して Base64 エンコードを、受信メッセージに対して Base64 デコードを実行します。
// SDK に上記の操作を実行させたくない場合は、getQueueRef() メソッドを呼び出すときに $base64 パラメーターを FALSE に設定します: $queue = $this->client->getQueueRef($queueName, FALSE)。
$queue = $this->client->getQueueRef($queueName);
$messageBody = "test";
// 2. SendMessageRequestItem オブジェクトを生成します。
// SendMessageRequestItem オブジェクトの DelaySeconds プロパティと Priority プロパティを構成できます。
// メッセージオブジェクトのプロパティの詳細については、「QueueMessage」を参照してください。
$bodyMD5 = md5(base64_encode($messageBody));
$request = new SendMessageRequestItem($messageBody);
try
{
$res = $queue->sendMessage($request)
// 3. メッセージが送信されます。
echo "MessageSent! \n";
}
catch (MnsException $e)
{
// 4. ネットワークエラーが発生した場合、またはメッセージが大きすぎる場合、メッセージの送信に失敗する可能性があります。例外をキャッチして原因を特定し、エラーを解決できます。
echo "SendMessage Failed: " . $e;
return;
}メッセージを受信して削除する
完全なサンプルコードについては、「CreateQueueAndSendMessage.php」をご参照ください。
$receiptHandle = NULL;
try
{
// 1. receiveMessage() メソッドを呼び出します。
// receiveMessage() メソッドを呼び出すときは、WaitSeconds パラメーターを 30 に設定することをお勧めします。
// waitSeconds パラメーターをゼロ以外の値に設定すると、メッセージを抽出するリクエストは HTTP ロングポーリングリクエストになります。メッセージがキューに送信されるか、リクエストがタイムアウトした場合にのみ、レスポンスが返されます。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. 受信ハンドルを取得します。受信ハンドルには有効期限があり、メッセージの変更または削除に使用できます。詳細については、「QueueMessage」を参照してください。
$receiptHandle = $res->getReceiptHandle();
}
catch (MnsException $e)
{
// 3. エラーが発生した場合、メッセージの受信に失敗する可能性があります。例外をキャッチして原因を特定し、エラーを解決できます。
echo "ReceiveMessage Failed: " . $e;
return;
}
// ビジネス要件に基づいてメッセージを処理するカスタムロジックを指定します。この手順は、サンプルコードでは省略されています。
// プログラムが失敗またはフリーズした場合、VisibilityTimeout パラメーターで指定された期間が経過すると、メッセージは他のプロセスによって消費される可能性があります。これにより、メッセージが失われるのを防ぎます。
// 4. メッセージが消費された後、キューからメッセージを削除できます。
try
{
// 5. deleteMessage() メソッドを呼び出します。
$res = $queue->deleteMessage($receiptHandle);
echo "DeleteMessage Succeed! \n";
}
catch (MnsException $e)
{
// 6. エラーが発生した場合は、例外をキャッチして原因を特定し、エラーを解決できます。
// 受信ハンドルが期限切れになると、MessageNotExist エラーが返されます。このエラーは、受信ハンドルを使用して対応するメッセージを見つけることができないことを示します。
// 受信ハンドルの期限が切れる前にメッセージを消費できるようにするには、VisibilityTimeout パラメーターを適切な値に設定する必要があります。changeMessageVisibility() メソッドを呼び出して、VisibilityTimeout パラメーターの値を変更できます。
echo "DeleteMessage Failed: " . $e;
return;
}