so-php / pubsub
该软件包最新版本(0.0.1-alpha)没有可用的许可证信息。
通过 php-amqplib 实现发布/订阅模式
0.0.1-alpha
2014-05-27 01:21 UTC
Requires
- php: >=5.3.0
- phpunit/phpunit: 3.7.*
- videlalvaro/php-amqplib: *
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();