zhousak/cmd-q

a queue based on php and redis

1.0 2014-11-26 02:36 UTC

README

#CmdQ

基于PHP和Redis的队列任务 ##安装 composer:

require: "zhousak/cmd-q": "1.0"

##说明

对于不同的队列对应不同的Channel,一个Channel有名字和队列数量(代表Redis中的list数量),Channel也有一个方法在pop出数据时统一执行。

##示例

###一个统计队列

在程序中统计用户行为,新建一个LogChannel

class LogChannel extends \CmdQ\Queue\Channel
{
    protected static $_name = 'log';

    protected static $_queueNumber = 10;

    public function beforePush($value)
    {
        return json_encode($value);
    }

    public function afterPop($value)
    {
        return json_decode($value, true);
    }

    public function processPopData($values)
    {
        //log to mysql or hadoop...
    }
}

这个队列在Redis中有10个list,对应的名字是log_1~log_10。beforePush把统计数据通过json_encode转成字符串,afterPop通过json_decode把字 符串再转回数组,在processPopData中会取出多条数据一次处理(取决于LogChannel继承的$_popNumber属性,默认是10)。

在应用程序中,就可以这样记录用户行为了:

use CmdQ\Queue\Base as Queue;
use CmdQ\Redis\Client as RedisClient;
$queue = new Queue(new LogChannel(), new Client('your redis host'));
$queue->push(array(
    //log data
));

push可以通过第二个参数指定队列,但只会在1和$_queueNumber之间。

在后端,执行数据处理非常简单,$queue->processPopData()会循环取出指定条的数据再统一处理,例如记录到数据库,或者做一些实时的统计(取决于 processPopData()方法)。processPopData方法也可以指定队列,默认是随机的。可以执行多个脚本加快数据处理,每个脚本可以指定一个队列, 也可以都是随机的。