送信側
まずメッセージの送信側は以下のような流れになります。
- 指定したキュー名のキューオブジェクトを作る
- メッセージを送る
では早速コードを書いてみます。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などのほかのサービスとあわせて利用することでいろいろな用途に使え、とても便利です。