GatewayWorker 分布初试
参考官网分布说明 http://doc2.workerman.net/326144
准备:两台内网服务器A1,A2
A1服务器写PHP脚本前端访问
<?php // 注意这里使用A2服务器的内网ip:port // 如果本地则可以使用 0.0.0.0:port // 外网服务器使用 外网ip:port GatewayClient::$registerAddress = "172.16.100.24:6000"; // 发送数据 GatewayClient::sendToUid( "6201944211a7", "sdsadadas" );
A2服务器写入gateway脚本
start_businessworker.php
<?php use \Workerman\Worker; use \Workerman\WebServer; use \GatewayWorker\Gateway; use \GatewayWorker\BusinessWorker; use \Workerman\Autoloader; // bussinessWorker 进程 $worker = new BusinessWorker(); // worker名称 $worker->name = 'HdwBusinessWorker'; // bussinessWorker进程数量 $worker->count = 4; // 服务注册地址 // 分布式则参考官网文档 // 同台服务器则可以使用 127.0.0.1:port // 内网服务器则可以使用 内网ip:port // 外网服务器则可以使用 外网ip:port $worker->registerAddress = '127.0.0.1:6000'; /** * 设置处理业务的类为MyEvent。 * 如果类带有命名空间,则需要把命名空间加上, * 类似$worker->eventHandler='\my\namespace\MyEvent'; */ // $worker->eventHandler = 'MyEvent'; // 设置使用哪个类来处理业务,默认值是Events,即默认使用Events.php中的Events类来处理业务。业务类至少要实现onMessage静态方法,onConnect和onClose静态方法可以不用实现。 // 如果不是在根目录启动,则运行runAll方法 if(!defined('GLOBAL_START')) { Worker::runAll(); }
start_gateway.php
<?php use \Workerman\Worker; use \Workerman\WebServer; use \GatewayWorker\Gateway; use \GatewayWorker\BusinessWorker; use \Workerman\Autoloader; // gateway 进程,这里使用Text协议,可以用telnet测试 $gateway = new Gateway("Hardware://0.0.0.0:6049"); // gateway名称,status方便查看 $gateway->name = 'HdwGateway'; // gateway进程数 $gateway->count = 4; // 本机ip,分布式部署时使用内网ip // 这里ip必须为内网ip满足A1服务器调用 $gateway->lanIp = '172.16.100.24'; // 内部通讯起始端口,假如$gateway->count=4,起始端口为4000 // 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口 $gateway->startPort = 6040; // 服务注册地址 $gateway->registerAddress = '127.0.0.1:6000'; // 心跳间隔 $gateway->pingInterval = 30; // $pingNotResponseLimit * $pingInterval 时间内,客户端未发送任何数据,断开客户端连接 $gateway->pingNotResponseLimit = 2; // 心跳数据 // 技巧1:如果客户端有定时向服务端发送心跳检测,则服务端可以不必向客户端发送心跳检测,即利用客户端主动发送的数据判断客户端是否存活。这时我们需要设置pingData='' $gateway->pingData = getPingData(); /* // 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调 $gateway->onConnect = function($connection) { $connection->onWebSocketConnect = function($connection , $http_header) { // 可以在这里判断连接来源是否合法,不合法就关掉连接 // $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket链接 if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net') { $connection->close(); } // onWebSocketConnect 里面$_GET $_SERVER是可用的 // var_dump($_GET, $_SERVER); }; }; */ // 如果不是在根目录启动,则运行runAll方法 if(!defined('GLOBAL_START')) { Worker::runAll(); }
start_register.php
<?php use \Workerman\Worker; use \GatewayWorker\Register; // register 服务必须是text协议 $register = new Register('text://0.0.0.0:6000'); // 如果不是在根目录启动,则运行runAll方法 if(!defined('GLOBAL_START')) { Worker::runAll(); }
服务器:
A1服务器无任何需要配置,
A2服务器①、Register服务监听的端口要可以被其它内网服务器访问(外网访问可以屏蔽);②、start_gateway.php中如果$gateway->startPort=2300; $gateway->count=4;
,则2300 2301 2302 2303四个端口需要被设置成能被其它服务器访问,也就是起始端口$gateway->startPort
到$gateway->startPort + $gateway->count - 1
这 $gateway->count
个端口要设置成能被其它内网服务器访问。
原创文章请随便转载。愿和大家分享,并且一起进步。-- 江 coder