router
说明:
callback Gateway::$router
设置 Gateway 到 BusinessWorker 路由规则。默认规则是 Gateway 随机选择一个 BusinessWorker 进程,然后把当前 client_id 与这个 BusinessWorker 进程绑定,以后这个 client_id 的所有数据(onConnect/onMessage/onClose 事件)都交给这个绑定的 BusinessWorker 进程处理。
期待该回调函数从所有到 BusinessWorker 进程的连接对象中选择一个并返回。
回调函数的参数
$worker_connnections
是一个包含了所有到 BusinessWorker 进程的连接对象数组。数组的下标是格式为 ip:worker_name:worker_id
的字符串。其中 ip 为 worker 所在服务器的 ip,worker_name 为 $businessworker->name
的值 (name 属性参见 workerman 手册),worker_id 为自动分配的进程 id 编号 (进程编号参见 workerman 手册)。这样通过下标就可以知道连接对应的 worker 在哪个服务器,属于哪组 worker,进程编号是多少,可以方便的将消息路由给期望的服务器上的进程中去处理。
如果打印 var_dump($worker_connnections)
,则是类似这样的数据。
array(4) {
["127.0.0.1:ChatBusinessWorker:0"]=>object(Workerman\Connection\TcpConnection)...,
["127.0.0.1:ChatBusinessWorker:1"]=>object(Workerman\Connection\TcpConnection)...,
["127.0.0.1:ChatBusinessWorker:2"]=>object(Workerman\Connection\TcpConnection)...,
["127.0.0.1:ChatBusinessWorker:3"]=>object(Workerman\Connection\TcpConnection)...,
}
(注意:GatewayWorker2.0.4 之前版本数组下标为 ip:port,并非 ip:worker_name:worker_id)
$client_connection
客户端连接对象,可以通过此对象获得客户端 ip 端口等信息,也可以向其添加一些动态属性用来保存当前连接的相关信息。
$cmd
当前什么类型的消息,是个数字,分别可能为
CMD_ON_CONNECTION,即连接事件
CMD_ON_MESSAGE,即消息事件
CMD_ON_CLOSE,即客户端关闭事件
$buffer
客户端发来的数据。注意只有当 $cmd
为 CMD_ON_MESSAGE
时 $buffer
才有值
返回值
返回 $worker_connnections
中的一个连接对象。
范例 1 随机路由
use \GatewayWorker\Gateway;
$gateway = new Gateway("Websocket://0.0.0.0:8585");
// ===随机路由开始===
$gateway->router = function($worker_connections, $client_connection, $cmd, $buffer)
{
return $worker_connections[array_rand($worker_connections)];
};
// ===随机路由结束===
$gateway->name = ...
...省略...
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
范例 2 随机绑定
use \GatewayWorker\Gateway;
$gateway = new Gateway("Websocket://0.0.0.0:8585");
// ==绑定==
$gateway->router = function($worker_connections, $client_connection, $cmd, $buffer)
{
// 临时给客户端连接设置一个businessworker_address属性,用来存储该连接被绑定的worker进程下标
if (!isset($client_connection->businessworker_address) || !isset($worker_connections[$client_connection->businessworker_address])) {
$client_connection->businessworker_address = array_rand($worker_connections);
}
return $worker_connections[$client_connection->businessworker_address];
};
// ==绑定==
$gateway->name = ...
...省略...
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}