読者です 読者をやめる 読者になる 読者になる

破棄されたブログ

このブログは破棄されました。

PHP から Amazon SQS を使ってみる

SQS の入門ガイドが未翻訳で PHPSDK も古いままだったから、 SDK 2 でやってみた。

IAM の準備

IAM のコンソールから試用用アカウントを作成してクレデンシャルを保存する。 作成したアカウントに SQS のアクセス権を与える。今回はとりあえずフルアクセス権を与えてみる。

SQS を使う

用意

$ cd /path/to/workspace
$ touch sqs.php
$ wget http://pear.amazonwebservices.com/get/aws.phar

キューの作成

最初に MyQueue という名前のキューを作ってみる。

<?php

require_once './aws.phar';
use \Aws\Sqs;

$aws_key_id = '********************';
$aws_sec_key = '****************************************';

$sqs = Sqs\SqsClient::factory(array(
    'key'       => $aws_key_id,
    'secret'    => $aws_sec_key,
    'region'    => 'ap-northeast-1',
));

$queuename = array(
    'QueueName' => 'MyQueue'
);

$newqueue = $sqs->createQueue($queuename);
print_r($newqueue);

リファレンス

存在するキューの確認

キューを作成したから、存在するキューの一覧を確認できる。

// キューの確認
$queues = $sqs->listQueues();
print_r($queues);

$queueurl = $sqs->getQueueUrl(array(
    'QueueName' => $queuename,
));

print_r($queueurl);

echo $queueurl['QueueUrl'] . PHP_EOL;

リファレンス

メッセージの送信

キューの存在を確認できたので、メッセージの送信をしてみる。

// メッセージの送信
$sndmessage = $sqs->sendMessage(array(
    'QueueUrl'      => $queueurl['QueueUrl'],
    'MessageBody'   => 'HAVE A NICE DAY',
));

print_r($sndmessage);

リファレンス

メッセージの受信

メッセージをキューに送ったので、受信できるようになった。受信時にどのメッセージを受信するかを選択することはできない。取得したい最大メッセージ数を指定すると、最大で指定された最大メッセージ数分のメッセージを取得する。受信リクエストに対して空のレスポンスが返ることもある。

メッセージの受信をしても、キューからメッセージは削除されない。受信リクエストとは別に削除リクエストを送信する必要がある。

以下はショートポーリングの場合の例。

// メッセージの受信
$received = $sqs->receiveMessage(array(
    'QueueUrl' => $queueurl['QueueUrl'],
));

print_r($received);

リファレンス

メッセージの削除

メッセージを受信したら、メッセージが処理済みでもう不要であることを伝えるため、キューからメッセージを削除する必要がある。削除対象のメッセージは receipt handle で指定する。

// メッセージの削除
$deletemessage = $sqs->deleteMessage(array(
    'QueueUrl'      => $queueurl['QueueUrl'],
    'ReceiptHandle' => $received['Messages'][0]['ReceiptHandle'],
));

リファレンス

メモ

Composer がクソ重いから今回は phar を require_once したけど、普通に使うときは Composer でインストールしましょうねと。

Amazon のサービスってことで、メンテしなくていいっていうすごいデカいメリットはあるものの、 AMQP とかのオープンなプロトコルに準拠してないから、他のプラットフォームに移行すると動かなくなってツラい。

Laravel っていうか Laravel はもうどうでもいいんだけど、 Illuminate/Queue があるからそっちどうかなって思ったら、抽象化されすぎてて受信側を他言語で実装しようと思ったときに、結局実装調べないといけなくて、抽象化とは一体なんだったのかって感じになる。 つまるところ、共通のプロトコルを定めて、そこに準拠するようにすべきなんだろう。 AMQP とかがそうなのかな。

広告を非表示にする