on

(要求Workerman版本>=3.3.0)

  1. void \Channel\Client::on(string $event_name, callback $callback_function)

订阅$event_name事件并注册事件发生时的回调$callback_function

回调函数的参数

$event_name

订阅的事件名称,可以是任意的字符串。

$callback_function

事件发生时触发的回调函数。函数原型为callback_function(mixed $event_data)$event_data是事件发布(publish)时传递的事件数据。

注意:

如果同一个事件注册了两个回调函数,后一个回调函数将覆盖前一个回调函数。

范例

多进程Worker(多服务器),一个客户端发消息,广播给所有客户端

start.php

  1. <?php
  2. use Workerman\Worker;
  3. use Workerman\Connection\TcpConnection;
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. // 初始化一个Channel服务端
  6. $channel_server = new Channel\Server('0.0.0.0', 2206);
  7. // websocket服务端
  8. $worker = new Worker('websocket://0.0.0.0:4236');
  9. $worker->name = 'websocket';
  10. $worker->count = 6;
  11. // 每个worker进程启动时
  12. $worker->onWorkerStart = function($worker)
  13. {
  14. // Channel客户端连接到Channel服务端
  15. Channel\Client::connect('127.0.0.1', 2206);
  16. // 订阅broadcast事件,并注册事件回调
  17. Channel\Client::on('broadcast', function($event_data)use($worker){
  18. // 向当前worker进程的所有客户端广播消息
  19. foreach($worker->connections as $connection)
  20. {
  21. $connection->send($event_data);
  22. }
  23. });
  24. };
  25. $worker->onMessage = function(TcpConnection $connection, $data)
  26. {
  27. // 将客户端发来的数据当做事件数据
  28. $event_data = $data;
  29. // 向所有worker进程发布broadcast事件
  30. \Channel\Client::publish('broadcast', $event_data);
  31. };
  32. Worker::runAll();

测试

打开chrome浏览器,按F12打开调试控制台,在Console一栏输入(或者把下面代码放入到html页面用js运行)

接收消息的连接

  1. // 127.0.0.1换成实际workerman所在ip
  2. ws = new WebSocket("ws://127.0.0.1:4236");
  3. ws.onmessage = function(e) {
  4. alert("收到服务端的消息:" + e.data);
  5. };

广播消息

  1. ws.send('hello world');