感谢以下博主的博文
https://www.cnblogs.com/sjfgod/p/7670703.html
<https://www.cnblogs.com/sjfgod/p/7670703.html>
https://www.cnblogs.com/qianlizeguo/articles/6856813.html
<https://www.cnblogs.com/qianlizeguo/articles/6856813.html>
http://blog.sina.com.cn/s/blog_62b832910100xok2.html
<http://blog.sina.com.cn/s/blog_62b832910100xok2.html>

在写这篇文章之前,我已经完成实践,想深入了解redis的发布订阅模式与实际运用,这种模式为生产者和消费者,可为1-1的关系(为消息队列),也可为1-N的关系,据说可运用场景为对数据可靠性要求不高的场景,如日志。我实践的小功能是基于WebSockets的这种双向通讯协议的,主要是解决服务端主动推送信息到客户端,替代轮询这种操作,此demo的github地址https://github.com/titlebaby/even-Communications。
是基于专为PHP打造的第三方包 "cboden/ratchet",有兴趣的同学可以看看,他们的官网是 http://socketo.me/
redis的服务器
windows端:https://github.com/mythz/redis-windows
<https://github.com/mythz/redis-windows>
linux:https://redis.io/download <https://redis.io/download>

windows下载扩展php_redis.dll:
https://pecl.php.net/package/redis/3.1.6/windows
<https://pecl.php.net/package/redis/3.1.6/windows>

php中的运用,必须要php_redis扩展
以下实践是win10系统

首先,解压redis的服务器包,直接双击‘redis-server.exe’,启动redis服务,不要关闭启动弹出的终端,关联了终端相当于就又关了redis。
同样双击“redis-cli.exe”输入subscribe first ,订阅频道
分别运行 sub.php,subscribe客服端是堵塞的,可以在终端运行这个php代码,效果更明显一些;更或者让其一直运行在后台
nohup /usr/bin/php /path/sub.php >> /tmp/sub.log 2>&1 &
再运行 pub.php,
当执行完pub.php后,在 redis-cli的终端和sub.php会收到“hello world!”则成功。原理需要细想。
#subscribe客服端 sub.php $redis = new \Redis(); $res = $redis->pconnect(
'192.168.6.33', 6379); $key = 'first'; #这里的subscribe是一个独占链接的,你在终端执行名“subscribe
first” 后,屏幕将如同开启redis服务的终端一样,处于一直在线等一样。因此此处可以看出订阅者(客服端)的程序是以阻塞的方式等待,发布者的消息。
$redis->subscribe(array($key),'callback'); function callback($redis, $channel,
$msg){ var_dump($redis); echo $channel; echo $msg; return true; } #public客服端
pub.php #无需独占链接,不是堵塞的 $redis = new \Redis(); $res = $redis->connect(
'192.168.6.33', 6379, 1 ); $key = 'first';//Channel 订阅这频道的订阅者,都能收收到消息 $value =
'hello world!'; $res = $redis->publish($key,$value); 说到这里可以完一小节了。
这里有个问题是,大规模的请求pub.php文件,要求发布消息,为了抗高并发的发布消息,是不是又应该使用队列(redis),但是我们把消息都放入到redis的队列中,怎么实时的监听redis中是否有数据,我看大多会说的,就是在linux中经常会用到的定时器。如:
##加一个定时器,修改让pub.php每个一分钟去redis中取数据 crontab -e */1 * * * * /path/pub.php
但是有没有更智能的呢?比如监听redis的消息队列?有就直接通知呢。有点晕了。。。。
最后一点,这个与ratchet不同的是,ratchet会自己在服务器上启动一个服务,这样就能在断网的情况下,也会往客服端推送消息。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信