php实现发布订阅
发布订阅模式简介
发布订阅模式是一种消息通信模式,发布者将消息发送到特定频道,订阅者接收感兴趣频道的消息,双方无需直接交互。PHP可通过多种方式实现该模式。
使用Redis实现
Redis内置发布订阅功能,PHP可通过predis或phpredis扩展操作:
安装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";
}
}
使用示例:
$topic = new Topic();
$topic->attach(new Subscriber());
$topic->publish("test message");
性能与选择建议
Redis适合轻量级、高频场景,RabbitMQ适合需要持久化、复杂路由的场景,纯PHP实现适合进程内通信。生产环境建议使用专业消息中间件,注意消息确认机制和异常处理。






