前回、Amazon SQSってなんじゃ?(その1 Scratchpad編)にて、SQSをScratchpadから利用してみましたが、今回はPHPから利用してみます。

○送信側
まずは、メッセージの送信側についてですが、以下のような流れになります。

  • 指定したキュー名のキューオブジェクトを作る
  • メッセージを送る

それでは、早速コードを書いてみます。

SDKのダウンロードと配置は、Amazon SimpleDBってなんじゃ?(その2 PHP SDK編)と同様なので割愛します。

send_message.php

create_queue($queueName)->body->CreateQueueResult->QueueUrl;
//キューURLを指定してメッセージを送ります。
$data = $sqs->send_message($queueURL, 'mamimumemo');

//戻り値から成否を判断します。
if($data->isOK()){
  print_r('成功~');
}
else{
  print_r('失敗~');
}
?>

これだけなので簡単です。
SimpleDBの時よりとてもシンプルです。

○受信側
そして、受信側です。
受信側の流れは、以下が一般的です。

  • 指定したキュー名のキューオブジェクトを作る
  • メッセージの待機
  • メッセージを受け取ったら処理
  • メッセージを削除

受信側は送信側と比べて少し特殊で、受信側はメッセージを待機し続ける必要があるため、メモリに常駐したワーカープロセスである場合がほとんどです。

また、待機のためのポーリングなども必要です。

受信側のコードは以下のような形になります。

recieve_message.php

#!/usr/bin/php

create_queue($queueName)->body->CreateQueueResult->QueueUrl;

//メッセージを待機します
while(true){
 //メッセージの取得を試みます。
  $data = $sqs->receive_message($queueURL);
 //正常受信
  if($data->isOK()){
   //メッセージがあったら処理
    if(isset($data->body->ReceiveMessageResult->Message)){
     //メッセージを取り出します。
      $msgdata = $data->body->ReceiveMessageResult->Message;
      $msg = $msgdata->Body;
     /*
      *ここで何か処理を行います。
      */

     //削除用のポインタを取得します。
      $handle = (string)$msgdata->ReceiptHandle;
     //メッセージを削除します。
      $sqs->delete_message($queueURL, $handle);
      print_r($msg . "n");
    }
   //メッセージがなければ1秒待機します。
    else{
      sleep(1);
    }
  }
 //受信異常
  else{
   //エラーを出力します。
    print_r($data->body->Error->Message . "n");
  }
}
exit(0);
?>

このPHPのコードはワーカプロセスにするため、コマンドラインからスクリプト起動します。

$ php recieve_message.php

上記のようにSQSはとてもシンプルなサービスですが、SimpleDBなどの他のサービスと合わせて利用することで、様々な用途に使えるため、とても便利です。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら