こんにちは@toshikimiyagawaです。
前回のエントリーに引き続きまして、今回もAmazonSQSの話題です。
前回はAmazonSQSの概要を説明しました。
今回は実際のソースコードを基に使い方を説明したいと思います。
事前準備
AmazonからPHPのSDKをダウンロードしてくる必要があります。こちらからダウンロードして、ダウンロードしたファイル内のaws.pharを作業ディレクトリに置いてください。
client側
まずはジョブを登録するclient側から見ていきましょう。下記のコードを書いたファイルにsetqueue.phpという名前をつけて作業ディレクトリに保存します。
<?php require_once('aws.phar'); use Aws\Sqs\SqsClient as SqsClient; $config = array ( 'key' => YOUR_ACCESS_KEY, 'secret' => YOUR_SECRET_KEY, 'region' => 'ap-northeast-1' ); date_default_timezone_set('Asia/Tokyo'); //SqsClientオブジェクトを作成 $client = SqsClient::factory($config); //Queueの名前からQueueUrlを取得 $queueUrl = $client->getQueueUrl(array('QueueName' => 'sqs_test')); //メッセージを登録 $client->sendMessageBatch( array( 'QueueUrl' => $queueUrl['QueueUrl'], 'Entries' => array( array( 'Id' => '1', 'MessageBody' => '登録時刻:'.date('c') ) ) ) );
worker側
次にジョブを取得するworker側を見ていきましょう。下記のコードを書いたファイルにgetqueue.phpという名前をつけて作業ディレクトリに保存します。
<?php require_once('aws.phar'); use Aws\Sqs\SqsClient as SqsClient; $config = array ( 'key' => YOUR_ACCESS_KEY, 'secret' => YOUR_SECRET_KEY, 'region' => 'ap-northeast-1' ); //SqsClientオブジェクトを作成 $client = SqsClient::factory($config); while(true){ //Queueの名前からQueueUrlを取得 $queueUrl = $client->getQueueUrl(array('QueueName' => 'sqs_test')); //Queueからメッセージを取得 $result = $client->receiveMessage(array( 'QueueUrl' => $queueUrl['QueueUrl'] )); $messages = $result->getPath('Messages/*/Body'); if(!empty($messages)){ //メッセージを元に処理を行う work($messages[0]); //処理が終わったらジョブを削除 $receiptHandle = $result->getPath('Messages/*/ReceiptHandle'); $client->deleteMessage(array('QueueUrl' => $queueUrl['QueueUrl'], 'ReceiptHandle' => $receiptHandle[0])); }else{ echo 'キューが空です。'.PHP_EOL; } sleep(1); } function work($message){ echo $message.PHP_EOL; sleep(10); }
実行結果
ターミナルをふたつ開いて(もしくはtmuxなど使って)、片方でgetqueue.phpを実行します。もう片方でsetqueue.phpを適当なタイミングで何回か叩くと以下の様なレスポンスがgetqueue.phpを実行した画面から返ってきます。
% php getqueue.php キューが空です。 キューが空です。 登録時刻:2013-08-04T16:58:26+09:00 キューが空です。 キューが空です。 登録時刻:2013-08-04T16:58:39+09:00 登録時刻:2013-08-04T16:58:41+09:00 登録時刻:2013-08-04T16:58:45+09:00 キューが空です。 登録時刻:2013-08-04T16:59:16+09:00 キューが空です。 キューが空です。
まとめ
このようにAmazon SQSとAWS SDKを利用するとお手軽にキューイングができちゃいます。みなさんも是非お試しください。