Help us understand the problem. What is going on with this article?

cakePHP3のQueue Pluginを使ってみる

More than 3 years have passed since last update.

初、Advent Calendarです。よろしくお願いします(^o^)
この記事は、CakePHP 3 Advent Calendar 201513日目用に書きました。

Queue Pluginって?

イケメンのMark S.さんが作ってくれている、CakePHP Queue Pluginのことです。
DBにTaskを追加して、Queue用のworkerを動かしておくと、定期的にTaskを実行してくれます。

なぜ、Queue Pluginを使ったか

スクレイピングでデータを貯めて、それを参照するWebアプリを作っています。
定期的にスクレイピングしてデータを貯めていますが、それが追いつかない時に、追加でスクレイピングしてくれる仕組みがあると良いなと考え、調べた結果、Queue Pluginを使ってみることにしました。

※スクレイピングの実行間隔を狭めれば良いんじゃないかとか思いましたが、まぁそれはそれ(^o^)

使い方

install

composerで一発です。便利便利。

composer require dereuromark/cakephp-queue:dev-master

あとは、実行時にPulginを読み込むように、bootstrapに下記を追記します(loadAllしてる場合は必要ありません)。

bootstrap.php
Plugin::load('Queue');

最後に、Queue用のテーブルを作成します。
queued_tasksという名前になっていると思います。

./bin/cake migrations migrate -p Queue

Taskの作り方

QueueにTaskを登録するには、まず登録するためのTaskを作る必要があります。
ここでいうTaskとは、Shellから実行するためのTaskのことを指します(公式サイト:Shell Tasks)。
具体的には、こんなやつです。Shellからmain()を実行することができます。

SampleTask.php
namespace App\Shell\Task;

use Cake\Console\Shell;

class SampleTask extends Shell
{
    public function main()
    {
        // some codes
    }
}

上記は普通のTaskです。
似てますが、Queue用のTaskは、こんな感じになります。

QueueSampleTask.php
namespace App\Shell\Task;

use Queue\Shell\Task\QueueTask;

class QueueSampleTask extends QueueTask
{
    public function add() {
        $this->out('call add!!');
    }

    public function run($data, $id = null)
    {
        $this->out('call run!!');
        return true;
    }
}

extendsがShellではなく、QueueTaskになってるのが違います。
あと、main()ではなく、add()とrun()に処理を書いていきます。
run()は、最後に実行結果をbool値で返します。

addとrunの違い

Queue用に作られたTaskは、2通りの方法で実行できます。
1つはコマンドラインから、下記を実行します。

./bin/cake Queue.Queue add <TaskName>

この場合は、add()が即座に実行されます。
Queue用のテーブルには、何も書き込まれません。

run()についてですが、これはControllerやModelから実行することができます。
Controllerは、こんな感じ。

SomeController.php
$this->loadModel('Queue.QueuedTasks');
$this->QueuedTasks->createJob(<TaskName>, array('to' => 'user@example.org', ...)));

Modelからは、こんな感じです。

SomeTable.php
TableRegistry::get('Queue.QueuedTasks')->createJob(<TaskName>, array('to' => 'user@example.org', ...)));

これが処理されると、DBのqueued_tasksにTaskが登録されます。
TaskNameはadd()の時と同じで、次の引数は、run()の\$dataに渡されます。
run()の引数である\$idには、DBに登録されたidが入ります。
DBに登録されたTaskは、下記を実行すれば、順番に処理されていきます。

./bin/cake Queue.Queue runworker

Taskがなければ、新しいTaskが登録されるまでスリープ状態となります。
workerの動きは、ある程度制御できるようです。
公式にあるConfigurationの説明を参考にしてください。

TaskNameについて

Taskの名前ですが、クラス名からQueueとTaskを除いた文字列となります。
QueueSampleTaskだと、Sampleとなります。もしくは、QueueSampleでも動きます。
Queueというプレフィックスは必須ではないですが、他のTaskと区別するために、あったほうが良いかなと思います。
有効なTaskは、下記を実行すると確認することができます。

./bin/cake Queue.Queue

終わりに

思ったより長くなってしまいましたが、最後まで書けて良かったです。
cakePHPはいろんなことができるし、コミュニティの人もとても親切なので、使っててとても楽しいです(^o^)
それでは、良いcakeライフを!

ukisoft
まったり developer です。python と js を使うことが多いです。
rymansat
普段は宇宙開発に関わっていないサラリーマンが身近で誰でもできる宇宙開発を実現させることがリーマンサット・プロジェクト(Ryman Sat Project=rsp.)の目的です。キューブサットの開発をはじめ、宇宙を軸として様々なコミュニティやクリエイターとコラボレーションし、民間宇宙開発に関するネットワークを強化、拡張することを目指して活動しています。
https://www.rymansat.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした