当前位置:首页 > PHP

php实现发布订阅

2026-03-13 03:40:30PHP

发布订阅模式简介

发布订阅模式是一种消息通信模式,发布者将消息发送到特定频道,订阅者接收感兴趣频道的消息,双方无需直接交互。PHP可通过多种方式实现该模式。

使用Redis实现

Redis内置发布订阅功能,PHP可通过predisphpredis扩展操作:

安装predis库:

composer require predis/predis

发布消息示例代码:

<?php
require 'vendor/autoload.php';
$client = new Predis\Client();
$client->publish('channel_name', 'message_content');

订阅消息示例代码:

<?php
require 'vendor/autoload.php';
$client = new Predis\Client();
$pubsub = $client->pubSubLoop();
$pubsub->subscribe('channel_name');

foreach ($pubsub as $message) {
    if ($message->kind === 'message') {
        echo "Received: {$message->payload}\n";
    }
}

使用RabbitMQ实现

RabbitMQ是专业消息队列系统,支持更复杂的发布订阅场景:

安装PHP-AMQP扩展:

pecl install amqp

发布者代码示例:

<?php
$connection = new AMQPConnection(['host' => 'localhost']);
$connection->connect();
$channel = new AMQPChannel($connection);
$exchange = new AMQPExchange($channel);
$exchange->setName('logs');
$exchange->setType(AMQP_EX_TYPE_FANOUT);
$exchange->publish('message content');

订阅者代码示例:

<?php
$connection = new AMQPConnection(['host' => 'localhost']);
$connection->connect();
$channel = new AMQPChannel($connection);
$exchange = new AMQPExchange($channel);
$exchange->setName('logs');
$exchange->setType(AMQP_EX_TYPE_FANOUT);
$queue = new AMQPQueue($channel);
$queue->setFlags(AMQP_EXCLUSIVE);
$queue->declareQueue();
$queue->bind('logs');
while (true) {
    if ($message = $queue->get()) {
        echo $message->getBody();
        $queue->ack($message->getDeliveryTag());
    }
}

纯PHP实现简易版本

对于简单场景可基于SplSubject和SplObserver接口:

主题类实现:

class Topic implements SplSubject {
    private $observers = [];
    private $message;

    public function attach(SplObserver $observer) {
        $this->observers[] = $observer;
    }

    public function notify() {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }

    public function publish($message) {
        $this->message = $message;
        $this->notify();
    }
}

观察者实现:

class Subscriber implements SplObserver {
    public function update(SplSubject $subject) {
        echo "Received: " . $subject->message . "\n";
    }
}

使用示例:

php实现发布订阅

$topic = new Topic();
$topic->attach(new Subscriber());
$topic->publish("test message");

性能与选择建议

Redis适合轻量级、高频场景,RabbitMQ适合需要持久化、复杂路由的场景,纯PHP实现适合进程内通信。生产环境建议使用专业消息中间件,注意消息确认机制和异常处理。

标签: php
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php 无限分类的实现

php 无限分类的实现

无限分类的实现方法 无限分类通常用于构建树形结构数据,如商品分类、多级菜单等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 邻接列表是最简单的实现方式,通过在每个节点中存…

php 实现链表

php 实现链表

PHP 实现链表的方法 链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。PHP 中可以通过类和对象来实现链表。 定义链表节点类 创建一个 ListNode 类,用于表示链…

php 购物车实现session

php 购物车实现session

PHP 购物车实现(基于 Session) 在 PHP 中,使用 Session 实现购物车功能是一种常见方法。Session 可以跨页面存储用户数据,适合临时保存购物车信息。 初始化 Sessio…

php 实现扫码登录

php 实现扫码登录

PHP 实现扫码登录的流程 扫码登录的核心流程分为两部分:前端生成二维码并轮询状态,后端验证扫码状态并返回登录凭证。以下是具体实现方法: 生成唯一二维码 创建临时令牌 在用户访问登录页面时,后端生…