FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

Amazon SQSを使ってみた②

こんにちは@toshikimiyagawaです。
前回のエントリーに引き続きまして、今回もAmazonSQSの話題です。
前回はAmazonSQSの概要を説明しました。
今回は実際のソースコードを基に使い方を説明したいと思います。

f:id:no_sugiyama:20150722162658p:plain


事前準備

AmazonからPHPSDKをダウンロードしてくる必要があります。
こちらからダウンロードして、ダウンロードしたファイル内の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を利用するとお手軽にキューイングができちゃいます。
みなさんも是非お試しください。