送信側
まずメッセージの送信側は以下のような流れになります。
- 指定したキュー名のキューオブジェクトを作る
- メッセージを送る
では早速コードを書いてみます。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のときよりはるかにシンプルです。簡単。
受信側
次に受信側です。受信側の流れは以下が一般的です。
- 指定したキュー名のキューオブジェクトを作る
- メッセージの待機
- メッセージを受け取ったら処理
- メッセージを削除
受信側は送信側とくらべてやや特殊です。
なぜなら受信側はメッセージを待機し続ける必要があるため、メモリに常駐したワーカープロセスである場合がほとんどです。また、待機のためのポーリングなども必要です。
受信側のコードは以下のような形になります。
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などのほかのサービスとあわせて利用することでいろいろな用途に使え、とても便利です。