在上篇文章中,已经可以使用Redis原生的命令实现消息发布、订阅模式,本节中尝试在PHP中实现相同的操作。
1、实现消息订阅脚本
新增sub.php脚本文件,代码如下:
<?php // 使用redis订阅、发布示例 date_default_timezone_set("PRC"); header('Content-type:text/html;charset=utf-8'); // 避免在默认情况下1分钟后终止与redis服务器德连接 ini_set('default_scoket_timeout', -1); // 实例化redis类,监听订阅信息 $redis=new redis(); $redis->connect('127.0.0.1',6379); // 订阅名为task_queue的频道 $redis->subscribe(['task_queue'],function($redis,$chan,$msg){ switch ($chan) { case 'task_queue': echo $msg."\t\n"; //在命令行中显示接收到的信息 break; default: # code... break; } }); ?>
因为需要一直监听Redis中的频道动态,sub.php需要持续执行,所以不能使用浏览器访问,同时为了防止与 Redis连接超时,定义脚本的命令如下
//避免在默认的配置下1分钟后终止与 Redis服务器的连接
ini_set('default_socket_timeout,-1)
Redis扩展中的 subscribe方法传入了两个参数。第一个参数是需要订阅的频道名,可以是多个,例如数组类型:第二个参数是一个回调方法,其包含3个参数,分别是Redis
对象( $Redis)、频道名( Schan)和消息(Smsg)。在 subscribe()方法体内对不同频道进行筛分执行不同的工作,代码如下:
case 'task_queue' //获取消息主体内容,然后执行相应的任务 break;
2、实现消息发布功能
新增pub.php脚本文件,用来给特定频道发布消息。sub.php脚本实现队列消费功能,而pub.php脚本则模拟实现队列操作。实现代码如下:
<?php // 发布订阅消息 date_default_timezone_set("PRC"); header('Content-type:text/html;charset=utf-8'); $redis=new redis(); // 第一个参数为redis服务器ip,第二个为端口 $res=$redis->connect('127.0.0.1',6379); // test为发布的频道名称,hello,word为发布的消息 $res=$redis->publish('task_queue',('当前时间为:'.date('Y-m-d H:i:s'))); if(!$res){ echo "发布订阅失败!"; die; } echo "发布订阅成功!";
相比消息订阅方法,publish()方法的使用较为简单,只需传入频道名称和消息合这两个参数即可:
$res=$tedis->publish(' task queue',('当前时间:',date('Y-m-d H:i:s')));
每次执行 pub.php脚本,就可以向 task_queue频道发送最新的时间信息,为了测试脚本是否正常,在命令行中执行以下命令:
php sub.php
随后在浏览器中访问 pub. php脚本文件,返回结果如下
发布订阅成功!
再执行sub.php脚本命令,显示结果如下:
php sub.php
当前时间为:2019-08-14 23:20:03
当前时间为:2019-08-14 23:20:04
当前时间为:2019-08-14 23:20:04
文章评论(0)