php实现发布订阅
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 框架内的发布订阅需求。







