php 基于redis的发布订阅工具类

复制代码
<?php

class RedisPubSub {
    private $redis;
    private $config;
    private $subscribed = false;

    public function __construct($config = []) {
        $this->config = array_merge([
            'host' => '127.0.0.1',
            'port' => 6379,
            'password' => null,
            'database' => 0,
            'timeout' => 0
        ], $config);

        $this->connect();
    }

    private function connect() {
        $this->redis = new Redis();
        $this->redis->connect(
            $this->config['host'],
            $this->config['port'],
            $this->config['timeout']
        );

        if ($this->config['password']) {
            $this->redis->auth($this->config['password']);
        }

        $this->redis->select($this->config['database']);
    }

    public function publish($channel, $message) {
        return $this->redis->publish($channel, json_encode($message));
    }

    public function subscribe($channels, $callback) {
        if (!is_array($channels)) {
            $channels = [$channels];
        }

        $this->redis->subscribe($channels, function ($redis, $channel, $message) use ($callback) {
            $callback($channel, json_decode($message, true));
        });
    }

    public function psubscribe($patterns, $callback) {
        if (!is_array($patterns)) {
            $patterns = [$patterns];
        }

        $this->redis->psubscribe($patterns, function ($redis, $pattern, $channel, $message) use ($callback) {
            $callback($pattern, $channel, json_decode($message, true));
        });
    }

    public function unsubscribe() {
        if ($this->subscribed) {
            $this->redis->unsubscribe();
        }
    }

    public function __destruct() {
        $this->unsubscribe();
        $this->redis->close();
    }
}
复制代码

使用方法

// 发布消息
$pubsub = new RedisPubSub();
$pubsub->publish('news', ['title' => 'Breaking News', 'content' => 'PHP 8.2 released!']);

// 订阅消息(通常在单独的脚本或进程中运行)
$pubsub = new RedisPubSub();
$pubsub->subscribe('news', function($channel, $message) {
echo "Received on $channel: ";
print_r($message);
});

// 使用模式订阅
$pubsub->psubscribe('news.*', function($pattern, $channel, $message) {
echo "Pattern [$pattern] received on $channel: ";
print_r($message);
});

 

 

注意事项:

  1. 订阅操作是阻塞的,建议在单独的进程/线程中运行
  2. 需要安装 phpredis 扩展:pecl install redis
  3. 长时间运行的订阅进程建议使用 CLI 模式执行
  4. 可以通过配置参数调整序列化方式(JSON/serialize等)
  5. 生产环境建议添加错误处理和重连机制

作者:itbaby

出处:https://www.cnblogs.com/itbaby/p/18756974

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   知风阁  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2023-03-07 hashid,短链接项目算法神器
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示