1 什么是redis订阅php
Redis 发布订阅(pub/sub)是一种消息通讯模式:发送者(pub)发送消息,订阅者(sub)接收消息。直接点,你能够理解为我关注了你,你发布了信息,文章等,我就能够立马收的到。laravel
2 发布订阅的场景在哪里面试
好比如下几个场景:redis
2.1 典型的网页上的消息能够作到实时通知sql
2.2 订单下单之后 经过redis订阅实时通知库存改变shell
2.3 接口须要作一些好比发送邮件 写日志等功能的时候能够运用到redis订阅了 这样会加快接口返回时间缓存
3 php如何实现 实时发布订阅服务器
知道了什么是订阅,发布的场景,下面来看看如何用php与redis实现发布订阅markdown
3.1 cli.php,这个为订阅端的代码 主要注意的是这个代码放在cli下执行 php架构
<?php
while (true){
echo time();
ini_set('default_socket_timeout', -1); //不超时
$redis = new Redis();
$redis->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 这个代码能够放在普通网页下执行
<?php
$redis = new Redis();
$redis->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触发命令。直接后台执行。
以上内容但愿帮助到你们, 不少PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提高,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货须要的能够免费分享给你们 ,须要戳这里 PHP进阶架构师>>>实战视频、大厂面试文档免费获取