PHPでキューイングしたいなぁと思って、色々と調べていたらいくつか定番的なのがあった。まぁ、PHP関係ないのも含め。

けっこう手軽に導入できる。ただ今回は開発環境やコストから考えて、AWSのSQSを使ってキューイングすることにした。AWS安すぎるだろ…。

AWS SDK ver1からSQSを使う

諸事情有り、SDKはver1を使用している。

request.php

<?php
require_once ('Vendor/aws_sdk/sdk.class.php');

$sqs = new AmazonSQS();
$region = AmazonSQS::REGION_APAC_NE1;
$sqs->set_region($region);
$queueName = 'キュー名';
$queueURL = $sqs->create_queue($queueName)->body->CreateQueueResult->QueueUrl;
$data = $sqs->send_message($queueURL, '値' . time());
if ($data->isOK()) {
    echo 'OK';
}

receive.php

<?php
require_once('/Vendor/aws_sdk/sdk.class.php');

$sqs = new AmazonSQS();
$region = AmazonSQS::REGION_APAC_NE1;
$sqs->set_region($region);
$queueName = 'キュー名';
$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;
            echo $msg . "\n";

            // 削除
            $handle = (string)$msgData->ReceiptHandle;
            $sqs->delete_message($queueURL, $handle);
        } else {
            sleep(1);
        }
    } else {
        echo $data->body->Error->Message . "\n";
    }
}

receive.php を無限ループ状態にして、キューがあるか確認し、あればメッセージを受け取って、何らかの処理をするという感じ。なければ、1秒間寝かせる。

実際に運用をするには、プロセス管理ツールを使った方がいい。ここらへんはまた今度検証する。



blog comments powered by Disqus

Author

桜庭@ZARU / Twitter / Facebook / GitHub

株式会社ベーシック CTO + 株式会社フルセイル CTO。プログラミングが大好き。とにかくコード書きたい。

Published

20 January 2014

Category

PHP

Tags

エンジニア大募集

僕は君が泣くまで糞コードを書くのをやめない!

この画像にピンときたら、forkwellか、中途採用エントリーフォームから入力していただくか、Twitterで@zaruまで気軽にメッセージくださいませ。

Webエンジニア・アプリエンジニア・インフラエンジニア大募集

株式会社ベーシックでは、コードを書くのが大好きなWebエンジニア・ゲームを作るのが大好きなアプリエンジニア・大量トラフィックを捌くのが快感なインフラエンジニアを大大大大募集中です。社員・アルバイト、契約形態はたいていなんでも大丈夫です。とにかく、一緒にユーザ向けのサービスを開発していける仲間を募集しています。ちなみに、ベーシックの開発は全て自社サービスです。受託とかそーゆーのは一切やっていません。

興味を持った方!

興味を持った方はforkwellか、中途採用エントリーフォームから入力していただくか、Twitterで@zaruまで気軽にメッセージくださいませ。