先从安装开始
##Github https://github.com/kr/beanstalkd
cd beanstalkd-1.10
make 或者 make CFLAGS=-O2
注意,你不需要运行configure命令哦,因为对应的makefie已经是建立好了的。make之后在当前目录下生成了beanstalkd可执行程序,你也可以make install一下让它安装到/usr/local/bin中,或者你自己拷贝到一个自定义目录中即可。
./beanstalkd -hUse: ./beanstalkd [OPTIONS] Options: -b DIR wal directory -f MS fsync at most once every MS milliseconds (use -f0 for "always fsync") -F never fsync (default) -l ADDR listen on address (default is 0.0.0.0) -p PORT listen on port (default is 11300) -u USER become user and group -z BYTES set the maximum job size in bytes (default is 65535) -s BYTES set the size of each wal file (default is 10485760) (will be rounded up to a multiple of 512 bytes) -c compact the binlog (default) -n do not compact the binlog -v show version information -V increase verbosity -h show this help##b 设置二进制日志文件目录,Beanstalk支持把任务写入日志文件,便于恢复##l 设置监听地址##p 设置监听端口##v 查看版本 ################启动 不指定任何参数,表示在0.0.0.0 端口11300监听./beanstalkd &./beanstalkd -l 127.0.0.1 11301 &./beanstalkd -l 192.168.1.168 11302 & 在实际中应该监控这个进程,防止意外终止退出。为了更好理解Beanstalk的原理,建议阅读官方文档:github.com/kr/beanstalkd/blob/master/doc/protocol.md,以下是我个人的学习笔记:当Put一个job时,取决于是否设置了delay,job可能进入READY或DELAYED状态,DELAYED的job超时后(或者调用kick)变成READY,reserve命令取一个最新的READY的job并把其变为RESERVED状态(这个时候是被取出执行),RESERVED状态的job可以发送delete删除,也可以使用release释放,根据是否设置delay时间,可能变成READY或DELAYED状态,也可以调用bury命令让job进入休眠,休眠中的job可以被delete也可以用kick命令让其变为READY。当reserve一个READY状态的job去执行时,如果设置的运行超时时间,则在取出时开始计时,如果超时则会从新放回到READY队列。job的运行的剩余时间可以通过stats-job命令来查看。如果要分配更多时间给job,可以发送touch命令。命令reserve取job时,这个job可能来自任一tube(当前链接的watch list是多个时),默认,一个新链接watch一个叫default的tube。可以使用watch命令添加一个新的tube到watch list中(如果这样,一般就不要试图使用tube的名字来区分要执行的任务,比如有两个tube A和B,当reserve取job时,这个job可能来自A也可以来自B,不过前提是A和B都在watch list中)。如果要取指定tube的job,明确使用use即可,这样只会获取指定tube的job。可以在消费方建立新链接后,watch某个tube以期望获取它的job(也可以使用use只获取特定tube的job)。同样道理,要put某个job都某个tub,需要先使用use命令,否则就是put到默认的叫default的tube中。reserve命令只是取状态为READY的job,如果要去其它状态的job,则需要使用peek和peek-xxxx命令(peek-ready peek-delayed peek-buried)。job取出后根据它的状态可以做相应 *** 作,比如delete release bury kick。PHP框架Phalcon中提供对Beanstalk的客户端库://Connect to the queue$queue = new Phalcon\Queue\Beanstalk(array( 'host' => '127.0.0.1', 'port' => 11300)) 链接到Beanstalk只有两个参数,并没有验证等信息,以上指定的就是默认值。Beanstalk是支持多host的,Phalcon\Queue\Beanstalk看来并没有实现这个。在调用put执行,应该首先调用choose()方法指定tube,否则就是使用default这个tube。(这个所谓的choose实际就是发送use命令)然后再调用put把job添加到你期望的tube中:1 $qid = $queue->put("Queue Message") 注意,put成功就返回job的标识符。以下展示一个完整的例子:$queue = new Phalcon\Queue\Beanstalk(array( 'host' => '127.0.0.1', 'port' => 11300)) $queue->choose("my_tube")for($i=0$i<10$i++){ $qid = $queue->put("My tube -- Queue Meaage $i") echo $qid."\n"} $queue->choose("default")for($i=0$i<10$i++){ $qid = $queue->put("Default tube -- Queue Meaage $i") echo $qid."\n"} 切换到消费端,首先要使用choose()来获取来自哪个tube的job(按照道理应该是调用watch()方法,但是实际测试,watch()没有起作用,只好换成choose指定特定tube),然后调用peekReady()获取一个Phalcon\Queue\Beanstalk\Job对象,当然如果失败就返回false,Job对象获取后,可以 *** 作自然就有delete() release() bury() touch() kick() 和 getBody(),其中getBody()获取Job的实际内容。$queue = new Phalcon\Queue\Beanstalk()//$queue->watch("my_tube")$queue->choose("my_tube") while(true){ if(($job = $queue->peekReady()) !== false){ $message = $job->getBody() echo $message."\n" $job->delete() }else{ usleep(200000) }} Phalcon\Queue\Beanstalk提供了Beanstalk协议的大部分内容,但是状态相关的没有实现。为了详细查看Beanstalk,可以使用一个第三方的PHP程序(github.com/ptrofimov/beanstalk_console):
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)