如圖所示
<?php
use Webman\GatewayWorker\Gateway;
use Webman\GatewayWorker\BusinessWorker;
use Webman\GatewayWorker\Register;
return [
'gateway' => [
'handler' => Gateway::class,
'listen' => 'websocket://0.0.0.0:7373',
'count' => cpu_count(),
'reloadable' => false,
'constructor' => ['config' => [
'lanIp' => '127.0.0.1',
'startPort' => 2300,
'pingInterval' => 25,
'pingData' => '{"type":"ping"}',
'registerAddress' => '127.0.0.1:1236',
'onConnect' => function(){},
]]
],[
'handler' => Gateway::class,
'listen' => 'tcp://0.0.0.0:8383',
'count' => cpu_count(),
'reloadable' => false,
'constructor' => ['config' => [
'lanIp' => '127.0.0.1',
'startPort' => 2310,
'pingInterval' => 25,
'pingData' => '{"type":"ping"}',
'registerAddress' => '127.0.0.1:1236',
'onConnect' => function(){},
]]
],
'worker' => [
'handler' => BusinessWorker::class,
'count' => cpu_count()*2,
'constructor' => ['config' => [
'eventHandler' => plugin\webman\gateway_1\Events::class,
'name' => 'ChatBusinessWorker',
'registerAddress' => '127.0.0.1:1236',
]]
],
'register' => [
'handler' => Register::class,
'listen' => 'text://0.0.0.0:1236',
'count' => 1, // Must be 1
'constructor' => []
],
];
根據(jù)目錄顯示的
'gateway' => [
'handler' => Gateway::class,
'listen' => 'websocket://0.0.0.0:7373',
'count' => cpu_count(),
'reloadable' => false,
'constructor' => ['config' => [
'lanIp' => '127.0.0.1',
'startPort' => 2300,
'pingInterval' => 25,
'pingData' => '{"type":"ping"}',
'registerAddress' => '127.0.0.1:1236',
'onConnect' => function(){},
]]
],[
'handler' => Gateway::class,
'listen' => 'tcp://0.0.0.0:8383',
'count' => cpu_count(),
'reloadable' => false,
'constructor' => ['config' => [
'lanIp' => '127.0.0.1',
'startPort' => 2310,
'pingInterval' => 25,
'pingData' => '{"type":"ping"}',
'registerAddress' => '127.0.0.1:1236',
'onConnect' => function(){},
]]
]
<?php
namespace david\gateway;
use RuntimeException;
use Workerman\Connection\TcpConnection;
use Workerman\Worker;
/**
* 啟動(dòng)GatewayWorker服務(wù)
* - @link http://www.wtbis.cn/doc/gateway-worker/
*/
class Server
{
/**
* 運(yùn)行
* @return void
*/
public static function run(): void
{
/**
* 初始化默認(rèn)的配置
*/
$config = static::config('default');
Worker::$pidFile = $config['pid_file'] ?? '';
Worker::$stdoutFile = $config['stdout_file'] ?? '/dev/null';
Worker::$logFile = $config['log_file'] ?? '';
Worker::$eventLoopClass = $config['event_loop'] ?? '';
TcpConnection::$defaultMaxPackageSize = $config['max_package_size'] ?? 10 * 1024 * 1024;
if (property_exists(Worker::class, 'statusFile')) {
Worker::$statusFile = $config['status_file'] ?? '';
}
if (property_exists(Worker::class, 'stopTimeout')) {
Worker::$stopTimeout = $config['stop_timeout'] ?? 2;
}
/**
* 啟動(dòng)進(jìn)程
*/
foreach (static::config('process') as $name => $config) {
if ($config['enable'] ?? null) {
$handler = $config['handler'];
$listen = $config['listen'] ?? '';
$properties = $config['properties'] ?? [];
/** @var Worker $worker */
$worker = new $handler($listen);
$worker->name = $name;
foreach ($properties as $property => $value) {
$worker->{$property} = $value;
}
}
}
Worker::runAll();
}
/**
* GatewayWorker配置
* @param string $key
* @return array
*/
public static function config(string $key = 'default'): array
{
//密鑰
$gatewaySecret = getenv('GATEWAY_SECRET');
//注冊(cè)中心監(jiān)聽(tīng)地址
$registerListenAddress = getenv('GATEWAY_REGISTER_LISTEN_ADDRESS') ? getenv('GATEWAY_REGISTER_LISTEN_ADDRESS') : '127.0.0.1';
//注冊(cè)中心地址
$registerAddress = getenv('GATEWAY_REGISTER_ADDRESS') ? getenv('GATEWAY_REGISTER_ADDRESS') : '127.0.0.1';
//注冊(cè)中心端口
$registerPort = getenv('GATEWAY_REGISTER_PORT') ? getenv('GATEWAY_REGISTER_PORT') : '1236';
//本機(jī)IP
$lanIp = getenv('SOCKET_BIND_TO_IP') ? getenv('SOCKET_BIND_TO_IP') : '127.0.0.1';
if (false === $gatewaySecret) {
throw new RuntimeException('未設(shè)置環(huán)境變量:GATEWAY_SECRET');
}
//初始化通信密鑰
if (class_exists('\GatewayWorker\Lib\Gateway')) {
\GatewayWorker\Lib\Gateway::$registerAddress = $registerAddress . ':' . $registerPort;
\GatewayWorker\Lib\Gateway::$secretKey = $gatewaySecret;
} else {
throw new RuntimeException('\GatewayWorker\Lib\Gateway 不存在');
}
$config = [
/**
* 初始化默認(rèn)的配置
*/
'default' => [
'event_loop' => '',
'stop_timeout' => 2,
'pid_file' => runtime_path() . '/gateway_worker.pid',
'status_file' => runtime_path() . '/gateway_worker.status',
'stdout_file' => runtime_path() . '/logs/gateway_worker_stdout.log',
'log_file' => runtime_path() . '/logs/gateway_worker.log',
'max_package_size' => 10 * 1024 * 1024
],
/**
* 進(jìn)程配置
*/
'process' => [
//注冊(cè)中心進(jìn)程 http://www.wtbis.cn/doc/gateway-worker/register.html
'register' => [
//使能
'enable' => true,
//處理類
'handler' => \GatewayWorker\Register::class,
//監(jiān)聽(tīng)
'listen' => 'text://' . $registerListenAddress . ':' . $registerPort,
'properties' => [
//進(jìn)程數(shù)
'count' => 1,
//通信密鑰
'secretKey' => $gatewaySecret,
],
],
//客戶端連接的進(jìn)程 http://www.wtbis.cn/doc/gateway-worker/gateway.html
'gateway' => [
//使能
'enable' => true,
//客戶端連接的進(jìn)程
'handler' => \GatewayWorker\Gateway::class,
//應(yīng)用層協(xié)議、監(jiān)聽(tīng)地址、端口
'listen' => 'Frame://0.0.0.0:2121',
'properties' => [
//進(jìn)程數(shù)
'count' => 2,
//通信密鑰
'secretKey' => $gatewaySecret,
//設(shè)置進(jìn)程收到reload信號(hào)后是否reload重啟
'reloadable' => false,
//本機(jī)ip,分布式部署時(shí)使用內(nèi)網(wǎng)ip
'lanIp' => $lanIp,
// 內(nèi)部通訊起始端口,假如$gateway->count=4,起始端口為4000
// 則一般會(huì)使用4000 4001 4002 4003 4個(gè)端口作為內(nèi)部通訊端口
'startPort' => 4000,
//注冊(cè)中心地址
'registerAddress' => $registerAddress . ':' . $registerPort,
//心跳檢測(cè)時(shí)間間隔
'pingInterval' => 30,
//客戶端連續(xù)$pingNotResponseLimit次$pingInterval時(shí)間內(nèi)不發(fā)送任何數(shù)據(jù)(包括但不限于心跳數(shù)據(jù))則斷開(kāi)鏈接,并觸發(fā)onClose
'pingNotResponseLimit' => 1,
'onConnect' => function () {
},
],
],
//業(yè)務(wù)邏輯進(jìn)程 http://www.wtbis.cn/doc/gateway-worker/business-worker.html
'businessWorker' => [
//使能
'enable' => true,
//業(yè)務(wù)處理類
'handler' => \GatewayWorker\BusinessWorker::class,
'properties' => [
//事件處理類
'eventHandler' => \david\gateway\Events::class,
//進(jìn)程數(shù)
'count' => cpu_count(),
//通信密鑰
'secretKey' => $gatewaySecret,
//注冊(cè)中心地址
'registerAddress' => $registerAddress . ':' . $registerPort,
],
],
],
];
return $config[$key] ?? [];
}
}
<?php
namespace david\gateway\bootstrap;
use david\gateway\Server;
use Webman\Bootstrap;
use Workerman\Worker;
/**
* 初始化\GatewayWorker\Lib\Gateway::class
*/
class LibGateway implements Bootstrap
{
public static function start(?Worker $worker)
{
//讀取配置時(shí),自動(dòng)設(shè)置注冊(cè)中心地址和通信密鑰
Server::config();
}
}
#!/usr/bin/env php
<?php
/**
* GatewayWorker
* @link http://www.wtbis.cn/doc/gateway-worker/
*/
use david\gateway\Server;
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/support/bootstrap.php';
Server::run();