多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Beanstalkd **定义:轻量级,高性能,缝补是内存队列系统** ## 一.特性 1. 优先级(priority) * 支持任务插队,数字越小,优先级越高,0是最高 2. 延迟(delay) * 实现定时任务.比如论坛增加定时评论 3. 持久化(persistent data) * 支持定时将文件刷到日志中,即使宕机,重启后扔可找回文件 4. 预留(buried) * 支持吧一个任务设置为预留,这样,消费者就无法取出这个任务,等合适时机再拿 5. 任务超时重发(time-to-run) * 消费者必须再指定的世界内处理完这个任务,否则任务处理失败,会重新放的队列,等待消费 ## 二.管道(tube)与任务(job) 任务从进入管道到离开管道一共五个状态(reday,delayed,reserved,buried,delete) 1. 生产者将任务放到管道中,任务的状态可以是ready(表示任务已经准备好,随时可以被消费者读取),也可以是delayed(任务在被生产者放入管道时,设置了延迟,比如设置了5s延迟,意味着5s之后,这个任务才会变成ready状态,才可以被消费者读取) 2. 消费者消费任务(消费者将处于ready状态的任务读出来后,被读取处理的任务状态变为reserved) 3. 消费者处理完任务后,任务的状态可能是delete(删除,处理成功),可能是buried(预留,意味着先把任务放一边,等待条件成熟还要用),可能是ready,也可能是delayed,需要根据具体业务场景自己进行判断定义 4. 项目中的应用总结 生产者中常用的方法 useTube() : 如果没有管道,则创建对应管道,有,则直接使用 put() : 向管道中放任务 消费者中常用的方法步骤: 1. watch():监听管道 2. reserve():将管道中处于ready状态的任务读取出来 3.1 可以使用delete 方法删除任务 3.2 可以使用release 方法将任务放回ready状态 3.3 可以使用bury 方法将任务先放一边(例如发邮件,邮箱服务器挂掉),等待条件成熟再取出来 ### 五  使用Beanstalkd 实现类似redis秒杀活动 ~~~ <?php require "vendor/autoload.php"; use Pheanstalk\Pheanstalk; //连接beanstalkd $ph = new Pheanstalk('127.0.0.1', 11301); $tube_name = 'SecKill2'; //使用SecKill2管道 $SEC = $ph->useTube($tube_name); //模拟100人请求秒杀 for ($i = 0; $i < 100; $i++) { $uid = rand(10000000, 99999999); //获取当前队列已经拥有的数量,如果人数少于十,则加入这个队列 $total_jobs = $ph->statsTube($tube_name)['total-jobs']; $num = 10; if ($total_jobs < $num) { $SEC->put($uid);//向管道放任务 echo $uid . "秒杀成功"; } else { //如果当前队列人数已经达到10人,则返回秒杀已完成 echo "秒杀已结束<br>"; } } print_r($ph->statsTube($tube_name));//查看SecKill2管道的信息 ~~~ # Beanstalked的初步了解和使用(包括利用beanstalkd 秒杀消息队列的实现)