30
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 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ライフを!

30
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?