消息列队 php 基于redis 实现
2017-11-28 10:09
453 查看
说明
消息列队 基于PHP 实现。 之前 用python 的 flower 实现了 列队。 今天这里我们用的是 PHP 来实现; 在实际的业务环境中 PHP 用的多些;
PHP 实现列队 最重要的是用到了 redis list类型的 的 blPop 方法 的阻塞行为; bLPop方法 会移除list 中的一个元素 并放回该元素, 当list 为空时 可以设置 阻塞时间 过了这个时间会再次检测;以此来实现列队不中断程序检查list ;
列队添加数据
http://192.168.1.212:7575/task.php?&type=1&num=200
向列队中添加200 条测试数据
<?php function intodata($num=1000){ $redis=new Redis(); $redis->connect('redis',6379); echo "redis is runimg".$redis->ping(); //echo "check redis is runing:"; for ($i=0; $i < $num; $i++) { $data['id']=$i+1; $data['str']=md5(mt_rand(2,2000)); $redis->rPush('goods:task',json_encode($data)); } $redis->close(); return true; } switch ($_GET['type']) { case '1': // add...data $num=$_GET['num']?$_GET['num']:10; $adddata=intodata($num); var_dump($adddata); break; case '2': # code... break; case '3': # code... break; default: # code... break; }
执行列队
php queueBloop.php
<?php $redis=new Redis(); $redis->connect('redis',6379); // 出队 while (true) { // 阻塞设置超时时间为3秒 $task = $redis->blPop(array('goods:task'), 3); if ($task) { $redis->rPush('goods:success:task', $task[1]); $task = json_decode($task[1], true); echo $task['id'] . ':' . $task['cid'] . ':' . 'handle success'; echo PHP_EOL; sleep(1); } else { echo 'nothing' . PHP_EOL; sleep(5); } }
运行环境
要求 PHP 运行环境 支持 redis 参考前面博文 docker php-fpm nginx 配置博客 docker nginx镜像+phpfpm 镜像 组合配置 搭建 PHP+nginx 环境redis
php-redis 扩展
参考
https://segmentfault.com/a/1190000011084493相关文章推荐
- PHP基于Redis消息队列实现发布微博的方法
- [转载] 基于Redis实现分布式消息队列
- 基于PHP使用rabbitmq实现消息队列
- 短链接服务的接实现 基于nginx url php redis 、js二维码生成 、js二维码识别
- php 实现redis发布订阅消息及时通讯
- Android推送通知的实现--PHP+ANDROID做消息推送:基于IBM的MQTT协议的Tokudu项目测试
- 基于Redis的消息队列php-resque
- 简述基于redis和数据库实现的消息系统
- php 实现redis发布订阅消息及时通讯
- 基于Redis实现的延迟消息队列
- PHP使用php-resque库配合Redis实现MQ消息队列的教程
- PHP中利用redis实现消息队列处理高并发请求--简洁代码实现效果
- 基于Redis实现分布式消息队列(2)
- PHP使用Redis实现消息队列
- [置顶] Redis应用3-基于Redis消息队列实现的异步操作
- 基于zookeeper管理redis集群,实现消息路由(一)
- PHP中利用redis实现消息队列处理高并发请求
- php+redis消息队列抢购实现
- 基于Redis实现分布式消息队列
- 基于Redis实现分布式消息队列(3)