wunderwerkio / emitter-sdk
用于发射事件代理的PHP SDK
0.1.0
2022-05-16 12:01 UTC
Requires
- php: ^7.4|^8.0
- php-mqtt/client: ^1.2
Requires (Dev)
- drupal/coder: ^8.3
- phpstan/phpstan: ^1.6
- phpstan/phpstan-webmozart-assert: ^1.1
- phpunit/phpunit: ^9
- slevomat/coding-standard: ^7.2
- squizlabs/php_codesniffer: ^3.6
- symfony/polyfill-php80: ^1.25
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. )