読者です 読者をやめる 読者になる 読者になる

FuelPHPでGearmanを動かしてみた

FuelPHP Daemon 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!

無事動いた

めでたしめでたし