router
說明:
callback Gateway::$router
設置Gateway到BusinessWorker路由規(guī)則。默認規(guī)則是Gateway隨機選擇一個BusinessWorker進程,然后把當前client_id與這個BusinessWorker進程綁定,以后這個client_id的所有數(shù)據(jù)(onConnect/onMessage/onClose事件)都交給這個綁定的BusinessWorker進程處理。
期待該回調(diào)函數(shù)從所有到BusinessWorker進程的連接對象中選擇一個并返回。
回調(diào)函數(shù)的參數(shù)
$worker_connnections
是一個包含了所有到BusinessWorker進程的連接對象數(shù)組。數(shù)組的下標是格式為ip:worker_name:worker_id
的字符串。其中ip為worker所在服務器的ip,worker_name為$businessworker->name
的值(name屬性參見workerman手冊),worker_id為自動分配的進程id編號(進程編號參見workerman手冊)。這樣通過下標就可以知道連接對應的worker在哪個服務器,屬于哪組worker,進程編號是多少,可以方便的將消息路由給期望的服務器上的進程中去處理。
如果打印var_dump($worker_connnections)
,則是類似這樣的數(shù)據(jù)。
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之前版本數(shù)組下標為ip:port,并非ip:worker_name:worker_id)
$client_connection
客戶端連接對象,可以通過此對象獲得客戶端ip端口等信息,也可以向其添加一些動態(tài)屬性用來保存當前連接的相關(guān)信息。
$cmd
當前什么類型的消息,是個數(shù)字,分別可能為
CMD_ON_CONNECTION,即連接事件
CMD_ON_MESSAGE,即消息事件
CMD_ON_CLOSE,即客戶端關(guān)閉事件
$buffer
客戶端發(fā)來的數(shù)據(jù)。注意只有當 $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)];
};
// ===隨機路由結(jié)束===
$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();
}