当前位置:首页 > PHP

php实现发布订阅

2026-02-15 04:44:53PHP

PHP 实现发布订阅模式

发布订阅模式(Pub/Sub)是一种消息传递模式,允许发布者将消息发送到频道,而订阅者可以接收这些频道的消息。以下是在 PHP 中实现发布订阅的几种方法。

使用 Redis 实现发布订阅

Redis 是一个高性能的键值存储系统,支持发布订阅功能。以下是一个简单的实现示例:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 订阅频道
$redis->subscribe(['channel_name'], function ($redis, $channel, $message) {
    echo "Received message from $channel: $message\n";
});

// 发布消息
$redis->publish('channel_name', 'Hello, subscribers!');
?>
  • 订阅者通过 subscribe 方法监听频道。
  • 发布者通过 publish 方法向频道发送消息。

使用消息队列(如 RabbitMQ)

RabbitMQ 是一个流行的消息队列系统,支持发布订阅模式。以下是使用 PHP AMQP 扩展的示例:

<?php
$connection = new AMQPConnection([
    'host' => 'localhost',
    'port' => 5672,
    'login' => 'guest',
    'password' => 'guest'
]);
$connection->connect();

$channel = new AMQPChannel($connection);
$exchange = new AMQPExchange($channel);
$exchange->setName('logs');
$exchange->setType(AMQP_EX_TYPE_FANOUT);
$exchange->declareExchange();

// 发布消息
$exchange->publish('Hello, subscribers!', '');

// 订阅者
$queue = new AMQPQueue($channel);
$queue->setFlags(AMQP_EXCLUSIVE);
$queue->declareQueue();
$queue->bind('logs', '');

$queue->consume(function ($envelope, $queue) {
    echo $envelope->getBody() . "\n";
    $queue->ack($envelope->getDeliveryTag());
});
?>
  • 发布者通过 publish 方法发送消息到交换机。
  • 订阅者通过 consume 方法接收消息。

使用纯 PHP 实现简单的发布订阅

如果不依赖外部服务,可以通过 PHP 数组和回调函数实现简单的发布订阅:

<?php
class PubSub {
    private $subscribers = [];

    public function subscribe($event, callable $callback) {
        if (!isset($this->subscribers[$event])) {
            $this->subscribers[$event] = [];
        }
        $this->subscribers[$event][] = $callback;
    }

    public function publish($event, $data = null) {
        if (isset($this->subscribers[$event])) {
            foreach ($this->subscribers[$event] as $callback) {
                call_user_func($callback, $data);
            }
        }
    }
}

$pubsub = new PubSub();
$pubsub->subscribe('event_name', function ($data) {
    echo "Event triggered with data: " . $data . "\n";
});

$pubsub->publish('event_name', 'Hello, subscribers!');
?>
  • 订阅者通过 subscribe 方法注册回调函数。
  • 发布者通过 publish 方法触发事件并传递数据。

使用 Laravel 的事件系统

Laravel 提供了内置的事件系统,支持发布订阅模式:

<?php
// 定义事件
class MessageSent {
    public $message;
    public function __construct($message) {
        $this->message = $message;
    }
}

// 定义监听器
class SendNotification {
    public function handle(MessageSent $event) {
        echo "Notification sent: " . $event->message . "\n";
    }
}

// 注册事件和监听器
Event::listen(MessageSent::class, SendNotification::class);

// 触发事件
Event::dispatch(new MessageSent('Hello, subscribers!'));
?>
  • 通过 Event::listen 注册事件和监听器。
  • 通过 Event::dispatch 触发事件。

总结

  • Redis:适合高性能、轻量级的发布订阅需求。
  • RabbitMQ:适合复杂的消息队列场景。
  • 纯 PHP 实现:适合简单的应用场景,无需外部依赖。
  • Laravel 事件系统:适合 Laravel 框架内的发布订阅需求。

php实现发布订阅

标签: php
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用原生PHP实现分页功能需要结合数据库查询和HTML展示。以下是核心实现步骤: 数据库查询与分页逻辑 // 连接数据库 $conn = new mysqli('loca…

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session…

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="upload…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form actio…