すべてのプロダクト
Search
ドキュメントセンター

Simple Message Queue (formerly MNS):PHP 用 SMQ SDK を使用してキューのメッセージを管理する

最終更新日:Jan 13, 2025

このトピックでは、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;
}