当前位置:首页 > 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实现发布订阅

安装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实现发布订阅

<?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";
    }
}

使用示例:

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

性能与选择建议

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

标签: php
分享给朋友:

相关文章

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php实现短信验证

php实现短信验证

PHP实现短信验证的步骤 选择合适的短信服务提供商 国内常见的短信服务提供商包括阿里云短信、腾讯云短信、云片等。注册账号并获取API密钥和签名模板是第一步。这些平台通常提供详细的开发文档和SDK。…

php实现扫码登录

php实现扫码登录

PHP 实现扫码登录的方案 扫码登录通常基于以下流程:用户访问网页生成二维码(含唯一标识),手机扫码后确认登录,服务器验证并完成登录状态同步。以下是具体实现方法: 生成二维码与唯一标识 使用 PHP…