wunderwerkio/emitter-sdk

用于发射事件代理的PHP SDK

0.1.0 2022-05-16 12:01 UTC

This package is auto-updated.

Last update: 2024-09-16 16:49:45 UTC


README

此存储库提供了一个用于Emitter的PHP SDK。

安装

使用composer

composer require wunderwerkio/emitter-sdk

发射API

此PHP SDK实现了以下方法,如发射文档所述

  • connect
  • disconnect
  • publish
  • subscribe
  • unsubscribe
  • keygen
  • presence
  • me

示例

连接到发射服务器

use Wunderwerk\EmitterSDK\Emitter;

// Create Emitter instance.
$emitter = new Emitter();

// Connect to emitter server at host `localhost` and port `8080`.
// A username can be optionally passed as the third argument.
// The username is only used for the presence features (see https://emitter.io/develop/presence/).
$emitter->connect('localhost', 8080, 'my-username');

// Disconnect from server.
$emitter->disconnect();

发布

$emitter->publish(
  key: '__channel-key-with-write-permission__',
  channel: 'article1/',
  message: 'Hello World!'
);

订阅

请注意,此方法仅简单地订阅频道。
要接收消息,必须使用addMessageHandler方法!

$emitter->subscribe(
  key: '__channel-key-with-read-permission__', 
  channel: 'article1/'
);

监听消息

为了从服务器接收传入的消息,必须使用addMessageHandler注册一个回调处理程序。

此外,必须通过调用loop()来启动事件循环,以开始监听服务器连接。
此循环方法是阻塞的,但可以通过调用interrupt()方法来释放。

为了避免死锁,请确保您的代码结构允许在接收到所需的消息后调用一次interrupt()方法。

use Wunderwerk\EmitterSDK\EmitterInterface;

// Listen for incoming messages.
// Note: Multiple handlers can be assigned!
$handler = function (EmitterInterface $emitter, string $message, string $topic): void {
  printf('Incoming message for topic %s: %s', $topic, $message);

  // Interrupt event loop once the first message is received.
  $emitter->interrupt();
};

$emitter->addMessageHandler($handler);

// A handler can be removed again.
$emitter->removeMessageHandler($handler);

// Start event loop.
// The TRUE here means, that the event loop sleeps for a short amount of time before checking again for new messages. 
$emitter->loop(TRUE);

循环处理程序

内部事件循环支持在每次循环周期中调用自定义处理程序。这可以用来实现超时,例如,如果10秒内未接收到消息,则中断事件循环。

use Wunderwerk\EmitterSDK\EmitterInterface;

$handler = function (EmitterInstance $emitter, float $elapsedTime): void {
  printf('Loop running for %d seconds', $elapsedTime);

  // Interrupt event loop after 10 seconds runtime.
  if ($elapsedTime >= 10) {
    $emitter->interrupt();
  }
}

// Register handler.
$emitter->addLoopHandler($handler);

// Handler can be removed again.
$emitter->removeLoopHandler($handler);

生成频道密钥

要发布和订阅频道,发射需要频道密钥。可以通过传递主密钥、频道名称、所需的权限以及可选的频道密钥TTL(以秒为单位)来使用keygen()方法生成频道密钥。

$channelKey = $emitter->keygen(
  key: '__master-key-from-emitter-server__',
  channel: 'article1/',
  type: 'rwp' // Give permissions for e.g. r(ead), w(write) and p(resence)
  ttl: 0 // TTL in seconds for how long this key should be valid. 0 means key is valid indefinitely.
);

设备存在

发射内置了对设备存在的支持。
要接收来自其他用户的设备存在数据,可以使用presence()方法来订阅存在事件。

如果changes参数为FALSE,则不会自动接收其他用户的存在变化,并且必须通过再次调用presence()来请求。
请注意,发射最多只发送1000个用户的存在信息。

$emitter->presence(
  channelKey: '_channel-key-with-presence-permission__',
  channel: 'article1/',
  status: TRUE, // Receive full status in response.
  changes: TRUE, // Subscribe to presence changes.
)