ECサイト運営開発記

PHPフレームワーク Laravelの使い方を中心とした通販サイトの開発日記

Laravel5でAWSのSQSを使う 複数のキューを処理する方法

Laravel5でAWSのQueueサービスであるSQSに2つのキューを作成して、処理を実行させる。

[下準備]

  • AWSの管理画面にログイン
    • SQSに移動して、2つのキューを作成する
      • 注文メールの送信処理をするORDER_MAIL_QUEUEというキューを作成。
      • 商品在庫が少ないことを管理者に警告するALERT_MAIL_QUEUEを作成。
        • ユーザーにアクセス権を与えて終了


[Laravel]

  • .envファイルを編集
    • QUEUE_DRIVERの値をsqsに変更
  • config/queue.phpを編集
    • connectionsの項目に、sqsドライバーを使用したコネクションを2つ定義する
      • コネクション名は自由
      • keyとsecretはIAMのアクセスキーを指定。
      • queueにはキューのプロパティの項目に表示されているURLを指定。
      • regionは使用しているリュージョン。
<?php

return [

    // .envファイル内でQUEUE_DRIVERの値をsqsに変更していれば、無編集でOK。
    'default' => env('QUEUE_DRIVER', 'sync'),


    'connections' => [

        /* 省略 */

        'order_mail_queue' => [
            'driver' => 'sqs',
            'key'    => '******************',
            'secret' => '***********************',
            'queue'  => 'https://sqs.ap-northeast-1.amazonaws.com/hogehoge/ORDER_MAIL_QUEUE',
            'region' => 'ap-northeast-1',
        ],

        'alert_mail_queue' => [
            'driver' => 'sqs',
            'key'    => '******************',
            'secret' => '***********************',
            'queue'  => 'https://sqs.ap-northeast-1.amazonaws.com/hogehoge/ALERT_MAIL_QUEUE',
            'region' => 'ap-northeast-1',
        ],


    ],


]
  • コマンドラインから2つのキューに処理させるジョブを作成する
    • php artisan make:job OrderMailJob
    • php artisan make:job AlertMailJob
  • app/Jobs/ディレクトリに2つのジョブが作成されていることを確認して、各ジョブに処理内容を記述する
<?php

    /** OrderMailJob **/

    protected $order;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($orderNumber)
    {
        $this->order=Order::find($orderNumber);
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {

        // 注文メールを送信
        echo $this->order->order_name."さん あなたに注文メールを送りました!";

        // 以下送信処理省略

    }
<?php

    /** AlertMailJob **/

    protected $item;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($itemId)
    {
        $this->item=Item::find($itemId);
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {

        // 在庫警告メールを送信
        echo "店長" .$item->item_name."の在庫がやばいです!補充して下さい!";

        // 以下送信処理省略

    }
  • ジョブをキューの最後尾に追加する。
    • 今回はサンプルとして、route.phpに記述。
    • localhost/job/にアクセスして、それぞれのキューにジョブを追加する。
      • コンストラクタの引数に注文番号と商品IDを渡したインスタンス作成して、第3引数にコネクション名を指定すればいいだけ。
        • 第2引数は配列でパラメータを渡すことができるが、第一引数にオブジェクトを渡した場合は無視される仕様
<?php


Route::get("/job",function(){

  \Queue::push(new \App\Jobs\OrderMailJob("ORDER_0001"),null,"order_mail_queue");
  \Queue::push(new \App\Jobs\AlertMailJob("ITM_0001"),null,"alert_mail_queue");

});
    • キューに並んでいるジョブを処理してみる
      • php artisan queue:listen コネクション名 で指定したコネクションでキューに溜まったジョブを処理することができる。
        • php artisan queue:listen order_mail_queue
        • php artisan queue:listen alert_mail_queue
    • コンソールに文字列が表示されていれば成功。