2011年6月22日水曜日

Amazon SQSってなんじゃ?(その2 PHP SDK編)

前回、SQSをscratchpadから使用してみましたが、今回はPHPから利用してみます。

送信側

まずメッセージの送信側は以下のような流れになります。
  1. 指定したキュー名のキューオブジェクトを作る
  2. メッセージを送る

では早速コードを書いてみます。SDKのダウンロードと配置はSimpleDBの回と同様なので割愛します。

send_message.php
<?php

//ダウンロードしたSDKディレクトリのsdl.class.phpをロードします。
require_once('../../../sdk/sdk.class.php');
//アクセス用のキーを定義します。
$access_key = 'xxxxxxxxxxxxxx';
$secret_key = 'xxxxxxxxxxxxxxxxxxxxxxxx';
//キーをもとにSDKのSQSアクセサクラスを初期化します。
$sqs = new AmazonSQS($access_key, $secret_key);
//キュー名を定義します。
$queueName = 'moge';
//キュー名からキューURLを取得します。
$queueURL = $sqs->create_queue($queueName)->body->CreateQueueResult->QueueUrl;
//キューURLを指定してメッセージを送ります。
$data = $sqs->send_message($queueURL, 'mamimumemo');

//戻り値から成否を判断します。
if($data->isOK()){
  print_r('成功〜');
}
else{
  print_r('失敗〜');
}
?>
たったこれだけです。SimpleDBのときよりはるかにシンプルです。簡単。


受信側

次に受信側です。受信側の流れは以下が一般的です。
  1. 指定したキュー名のキューオブジェクトを作る
  2. メッセージの待機
  3. メッセージを受け取ったら処理
  4. メッセージを削除

受信側は送信側とくらべてやや特殊です。
なぜなら受信側はメッセージを待機し続ける必要があるため、メモリに常駐したワーカープロセスである場合がほとんどです。また、待機のためのポーリングなども必要です。

受信側のコードは以下のような形になります。
recieve_message.php
#!/usr/bin/php
<?php
//ダウンロードしたSDKディレクトリのsdl.class.phpをロードします。
require_once('../../../sdk/sdk.class.php');
//アクセス用のキーを定義します。
$access_key = 'xxxxxxxxxxxxxx';
$secret_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxx';
//キーをもとにSDKのSQSアクセサクラスを初期化します。
$sqs = new AmazonSQS($access_key, $secret_key);
//送信側と同じキュー名を定義します。
$queueName = 'moge';
//キュー名からキューURLを取得します。
$queueURL = $sqs->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などのほかのサービスとあわせて利用することでいろいろな用途に使え、とても便利です。