php高级 TP+Redis实现发布订阅和消息推送案例实战

Redis 的发布-订阅模型是一种消息通信模式,它允许客户端之间通过特定的频道进行通信。在这种模型中,有些客户端负责发布消息(发布者),而其他客户端则订阅它们感兴趣的频道并接收这些消息(订阅者)。

以下是 Redis 发布订阅的基本操作:

  1. SUBSCRIBE:订阅者使用此命令订阅一个或多个频道的消息。
  2. PUBLISH:发布者使用此命令向指定的频道发送消息。
  3. UNSUBSCRIBE:订阅者使用此命令取消订阅一个或多个频道的消息。
  4. PUNSUBSCRIBE:订阅者使用此命令取消订阅所有频道的消息。

这种模型非常适合实现实时应用,如实时通知、实时分析、实时数据更新等。

第一步: 在index/controller文件中创建个控制器 Publish.php 文件

php 复制代码
<?php
namespace app\mainapp\controller;

use app\mainapp\BaseController;
use think\cache\driver\Redis;
class Publish extends BaseController
{		
		protected $redis;
		
		public function __construct(){
			$redis = new Redis(Config::get('cache.stores.redis'));
			$redis->connect('127.0.0.1',6379);
			$this->redis = $redis;
			
		}
		
		//发布消息的控制器方法
		public function index()
		{
			
			//$this->redis->publish('频道名称','发布内容');
			//定义一个频道方法,往这个频道发布消息,频道名称:中英文都可以
			$res = $this->redis->publish('sixStar:index','发布内容');
			var_dump('发布订阅消息成功,接受者数量为:'.$res);
			
			//关闭
			$this->redis->close();
		}



		//订阅多个频道:
		//api
		public function api()
		{
			$this->redis->publish('sixStar:api','api平台开发专栏');
		}
		
		//swoole
		public function swoole()
		{
			$this->redis->publish('sixStar:swoole','swoole网络编程专栏');
		}
}

第二步 在项目 application/command.php中 加入一条指令,可参考 TP 添加定时任务 - 自定义指令

php 复制代码
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: dqh <dqh@163.com>
// +----------------------------------------------------------------------

// +----------------------------------------------------------------------
// | 控制台配置
// +----------------------------------------------------------------------
return [
    // 指令定义
    'commands' => [
		'hello' => 'app\command\Subscribe',
    ],
];
php 复制代码
<?php
/**
 * 自定义指令 - tp+redis实现发布订阅和消息推送
 */
namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\cache\driver\Redis;


class Subscribe extends Command
{
    protected function configure()
    {
        $this->setName('subscribe')->setDescription('接收订阅消息');
    }

    protected function execute(Input $input, Output $output)
    {
		
		$redis = new Redis();
			$redis->connect('127.0.0.1', 6379);
			
			//订阅这个频道,获取频道消息
			/*$res = $redis->subscribe(['sixStar:index'],function($instance,$channel,$message){//实例,频道,消息
				//$res = $redis->subscribe(['sixStar:index',''],function($instance,$channel,$message){//实例,频道,消息
				var_dump($message);
				//业务逻辑:发送短信,推送给用户等等
			});
			*/
			
			//匹配适应规则的所有的频道消息
			$res = $redis->psubscribe(['sixStar:*'],function($instance,$rule,$channel,$message){//实例,规则,频道,消息
				var_dump($message);
				//业务逻辑:发送短信,推送给用户等等
			});
			
        $output->writeln( date('Y-m-d H:i:s'));//输出内容
    }
}

第二步 执行

php think

会有一条 subscribe 指令的命令

php think subscribe

这样就订阅成功了

用postman 请求 Publish/index 发布消息的控制器方法 就能收到一条订阅

相关推荐
JaguarJack1 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo1 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack2 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理3 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082853 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe3 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
知我Deja_Vu3 天前
redisCommonHelper.generateCode(“GROUP“),Redis 生成码方法
数据库·redis·缓存
Charlie_lll3 天前
Redis脑裂问题处理——基于min-replicas-to-write配置
redis·后端
longxiangam3 天前
Composer 私有仓库搭建
php·composer
上海云盾-高防顾问3 天前
DNS异常怎么办?快速排查+解决指南
开发语言·php