so-php/pubsub

该软件包最新版本(0.0.1-alpha)没有可用的许可证信息。

通过 php-amqplib 实现发布/订阅模式

0.0.1-alpha 2014-05-27 01:21 UTC

This package is not auto-updated.

Last update: 2024-09-24 07:17:04 UTC


README

通过 php-amqplib 实现发布/订阅模式

避免技术锁定

本实现的一个目标是为 python、ruby 和 java 等其他技术提供发布和订阅功能,防止它们被锁定。这不是一个特别困难的任务——它只是意味着我们需要使用非专有消息队列(php-amqplib + rabbitmq)和一个非语言特定的消息格式。因此,我们选择使用 JSON 序列化数据结构,而不是 PHP 序列化字符串。

话虽如此,对事件参数的内容没有强制限制。开发者需要保持警惕,确保不要在事件参数中放入任何 PHP 或平台特定的内容。

消息结构

如上所述,消息是一个普通的 JSON 字符串。结构是一个具有三个键(仅此)的对象。

  • name 事件名称
  • time 事件的 ISO 8601 时间戳。时间应该是 UTC。
  • params 一个对象,用于保存事件参数。除了技术可行性和合理性之外,没有其他限制。即使参数为空,也应包含参数 {}
{
    "name": "some-event-name",
    "datetime": "2005-08-15T15:52:01+0000",
    "params": {
        "any": true,
        "number": 1.3,
        "of": "foo",
        "keys": {
           "of any nesting level": "but be reasonable"
        }
    }
}

使用方法

使用 PubSub 非常简单。大写字母表示需要提供/配置的值。

发布

// need a channel to work with
$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);
$ch = $conn->channel();

$pubSub = new PubSub($ch, EXCHANGE_NAME);
$pubSub->publish('foo', array('hello'=>'world'));

发布

// need a channel to work with
$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);
$ch = $conn->channel();

function doSomethingOnEvent(Event e){
   echo "Received event " . $e->getName() . " which was triggered on " . $e->getDateTime()->format('Y-m-d H:i:s') . " with the following params: " . print_r($e->getParams(),true);
}

$pubSub = new PubSub($ch, EXCHANGE_NAME);
$pubSub->subscribe('foo', 'doSomethingOnEvent');

// then wait for (and handle events)
// either:
$pubSub->wait(); // wraps $ch->wait() internally
// or directly on the channel object
$ch->wait();