初、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してる場合は必要ありません)。
Plugin::load('Queue');
最後に、Queue用のテーブルを作成します。
queued_tasksという名前になっていると思います。
./bin/cake migrations migrate -p Queue
Taskの作り方
QueueにTaskを登録するには、まず登録するためのTaskを作る必要があります。
ここでいうTaskとは、Shellから実行するためのTaskのことを指します(公式サイト:Shell Tasks)。
具体的には、こんなやつです。Shellからmain()を実行することができます。
namespace App\Shell\Task;
use Cake\Console\Shell;
class SampleTask extends Shell
{
public function main()
{
// some codes
}
}
上記は普通のTaskです。
似てますが、Queue用のTaskは、こんな感じになります。
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は、こんな感じ。
$this->loadModel('Queue.QueuedTasks');
$this->QueuedTasks->createJob(<TaskName>, array('to' => 'user@example.org', ...)));
Modelからは、こんな感じです。
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ライフを!