redis如何实现订阅发布与批量发送短信,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
成都创新互联公司于2013年开始,是专业互联网技术服务公司,拥有项目网站制作、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元莱芜做网站,已为上家服务,为莱芜各地企业和个人服务,联系电话:028-86922220
1 什么是redis订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。直接点,你可以理解为我关注了你,你发布了信息,文章等,我就可以立马收的到。
2 发布订阅的场景在哪里
比如以下几个场景:
2.1 典型的网页上的消息可以做到实时通知
2.2 订单下单以后 通过redis订阅实时通知库存改变
2.3 接口需要做一些比如发送邮件 写日志等功能的时候可以运用到redis订阅了 这样会加快接口返回时间
3 php如何实现 实时发布订阅
知道了什么是订阅,发布的场景,下面来看看如何用php与redis实现发布订阅
3.1 cli.php,这个为订阅端的代码 主要注意的是这个代码放在cli下执行 php
connect('127.0.01', 6379, 3600); $redis->auth('123456'); //设置密码 $result = $redis->subscribe(['test'],'callback'); print_r($result); sleep(0.1); } function callback($instance,$channelName,$message) { print_r($message); }
启动以后接下来我们来个发布端的代码
3.2 发布端的代码,pub.php 这个代码可以放在普通网页下执行
connect('127.0.0.1', 6379, 3600); $redis->auth('123456'); //设置密码 $message = '测试一下'; $ret=$redis->publish('test',$message);
到这里php redis订阅发布成功,是不是很简单,主要用到redis的subscribe方法,publish方法,当然这些代码在实际使用过程中还是可以优化的比如cli.php,根据自己的需要去实现吧。
这里贴个laravel实现的发布订阅的例子
#获取订阅到的消息
创建laravel的php artisan
命令在handle
里执行监代码
laravel的php artisan list
命令可以查看当前的任务,然后使用Linux的nohub
命令在后台常驻即可
public function handle() { #订阅消息redis $redis = new \Redis(); $redis->pconnect(Config("host"), Config("port")); $redis->auth(Config("password")); //订阅订单id ORDERID $redis->subscribe(['ORDERID'], function($redis, $channel,$message) { if ($channel == 'ORDERID'){ #这里$message为10002 if ($message){ //存储到自己的redis库 这里配置了多连接 $redis2 = Redis::connection('driver_outset_time'); $redis2->set('ORDERID_'.$message,time());#value为时间time() $redis2->EXPIRE('ORDERID_'.$message,time(), 24*60*60);#设置key过期时间为24小时 $this->xxxxx($message,xxx);#调用其他方法执行其他业务逻辑 } } }); }
接下来看看如何实现批量发送短信
1.首先将需要发送信息的手机号存入redis缓存
$redis = new \redis(); $conn = $redis->connect('localhost', 6379); $auth = $redis->auth('*****'); //redis设置了密码,需要认证 $list = Testuser::find()->asarray()->all(); for ($i=0; $i < count($list); $i++) { $redis->lpush('list',$list[$i]['email']); }
将所需发送的手机号存入到redis缓存中
2.调用短信接口发送短信
$redis = new \redis(); $conn = $redis->connect('localhost', 6379); $auth = $redis->auth('*****'); $lenth = $redis->llen('list'); for ($i=0; $i < $lenth ; $i++) { $phone = $redis->brpop('list',1,60);//从结尾处弹出一个值,超时时间为60s $phonenumber = $phone[1]; $sendmsg = send($phonenumber); if($sendmsg){ //处理发送成功的逻辑 }else{ //处理发送失败的逻辑 } usleep(500000);//微秒,调用第三方接口,需要注意频率, }
这里结合php的cli模式,通过函数exec触发命令。直接后台执行。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。