FuelPHPでGearmanを動かしてみた
Gearmanとは?
Gearmanはジョブキューサーバの一つです。
時間のかかる処理等をバックグラウンドで処理する時や、分散処理を行いたい時に使うとではないかと。
他の使い方はわかりませんが、これだけでも十分利用価値があります。
使ってみる
インストール方法は他のサイトみて下さい。
以前にビルドしたものの、どうやったか覚えてないので(;´Д`)
参考:
TheSchwartzの代わりにGearman+libdrizzleでジョブキューサーバ作る - 個人事業主のつぶやき
ジョブキューサーバ Gearmand を PHP から使ってみた | tech.kayac.com - KAYAC engineers' blog
とりあえず自分はgearmandにlibdrizzleを組み合わせてMySQLにキューを保存しています。
Net_Gearmanの導入
http://pear.php.net/package/Net_Gearman/からではなく、
https://github.com/lenn0x/net_gearmanからダウンロードして下さい。
E_STRICTエラーが発生するので…
fuel/app/vendor/net_gearmanへ解凍。
Tasksを作成。Clientも追加
fuel/app/tasks/gearman.php
<?php namespace Fuel\Tasks; set_include_path(get_include_path() . PATH_SEPARATOR . APPPATH . 'vendor/net_gearman'); require_once 'Net/Gearman/Client.php'; class Gearman { public function run() { \Daemon\Daemon::forge()->setCallback('\\Gearman_Worker::worker')->run(); } public function workertest() { $client = new \Net_Gearman_Client('localhost:4730'); $client->test(array('name'=>'world')); } }
なお、前回のDaemonパッケージを利用しています。
Workerを作成
fuel/app/classes/gearman/worker.php
<?php set_include_path(get_include_path() . PATH_SEPARATOR . APPPATH . 'vendor/net_gearman'); define('NET_GEARMAN_JOB_PATH', APPPATH . 'classes/gearman/job'); define('NET_GEARMAN_JOB_CLASS_PREFIX', 'Gearman_Job_'); require_once 'Net/Gearman/Worker.php'; class Gearman_Worker { public static function worker() { $servers = array('localhost:4730'); try { $worker = new Net_Gearman_Worker($servers); $worker->addAbility('test'); $worker->beginWork(); } catch (Net_Gearman_Exception $e) { new FuelException($e->getMessage()); } } }
Jobを作成
fuel/app/classes/gearman/job/test.php
<?php class Gearman_Job_test extends Net_Gearman_Job_Common { public function run($arg) { Log::error("Hello, " . $arg['name'] . "!"); } }
動かしてみる
$ php oil refine gearman $ ps aux | grep php harul 1939 0.0 0.1 136040 7532 ? S 13:33 0:00 php oil refine gearman harul 1940 0.0 0.2 136040 8056 ? S 13:33 0:00 php oil refine gearman harul 2967 0.0 0.0 15360 912 pts/0 S+ 13:33 0:00 grep --colour=auto php
動いているようだ
clientを動かしてみる
$ php oil refine gearman:workertest
ログを確認してみる
Error - 2012-08-12 13:51:35 --> Hello, world!
無事動いた
めでたしめでたし