这篇文章主要为大家分享了php-beanstalkd消息队列类实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。


概况:
Beanstalkd,一个高性能、轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Facebook Causes应用。后来开源,现在有PostRank大规模部署和使用,每天处理百万级任务。Beanstalkd是典型的类Memcached设计,协议和使用方式都是同样的风格,所以使用过memcached的用户会觉得Beanstalkd似曾相识。


beanstalk核心概念:
job:一个需要异步处理的任务,需要放在一个tube中。
tube:一个有名的任务队列,用来存储统一类型的job
producer:job的生产者
consumer:job的消费者
简单来说流程就一句话:
由 producer 产生一个任务 job ,并将 job 推进到一个 tube 中,
然后由 consumer 从 tube 中取出 job 执行(当然了,这一切的操作的前提是beanstalk服务正在运行中)。

一个job有READY(时刻准备着被消费者取出), RESERVED(任务正在被一个消费者处理中), DELAYED(延迟任务,设定的延迟时间后进入ready状态), BURIED(休眠中,需要转移状态后才能操作)四种状态。当producer直接put一个job时,job就处于READY状态,等待consumer来处理,如果选择延迟put,job就先到DELAYED状态,等待时间过后才迁移到READY状态。consumer获取了当前READY的job后,该job的状态就迁移到RESERVED,这样其他的consumer就不能再操作该job。当consumer完成该job后,可以选择delete, release或者bury操作;delete之后,job从系统消亡,之后不能再获取;release操作可以重新把该job状态迁移回READY(也可以延迟该状态迁移操作),使其他的consumer可以继续获取和执行该job;有意思的是bury操作,可以把该job休眠,等到需要的时候,再将休眠的job kick回READY状态,也可以delete BURIED状态的job。正是有这些有趣的操作和状态,才可以基于此做出很多意思的应用,比如要实现一个循环队列,就可以将RESERVED状态的job休眠掉,等没有READY状态的job时再将BURIED状态的job一次性kick回READY状态。


例子分析:微博是一个很典型的例子:
1,发一个微博
2,推送给他的粉丝 (如果有100w个粉丝,这个地方会堵塞很久,用户感受到的就是延迟)
在微博上发布一条内容要做上面两件事情才算完整,发一条微博只需要进行一次简单的数据库操作,
但是推送给他的粉丝却要操作100w次数据库,导致用户发一个微博要等待很长的延迟才能返回结果发送成功。
采用队列的方式,用户发送一条微博立马返回结果,发送成功,剩下的推送就放到队列里面异步执行,
推送并不需要特别及时,延迟过几秒几十秒都是可以接受的。


本文实例为大家分享了php beanstalkd消息队列类的具体代码,供大家参考,具体内容如下

1