1. 安装 Workerman
composer require workerman/gateway-worker
2. 创建 Workerman 启动文件
php artisan make:command WorkermanCommand
<?php
namespace App\Console\Commands;
use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;
use GatewayWorker\Register;
use Illuminate\Console\Command;
use Workerman\Worker;
class WorkermanCommand extends Command
{
protected $signature = 'workerman {action} {--d}';
protected $description = 'Start a Workerman server.';
public function handle()
{
global $argv;
$action = $this->argument('action');
// windows 下启动需要分开启动协议
if ($action === 'single')
{
$start = $this->option('start');
if ($start === 'register')
{
$this->startRegister();
}
elseif ($start === 'gateway')
{
$this->startGateWay();
}
elseif ($start === 'worker')
{
$this->startBusinessWorker();
}
Worker::runAll();
return;
}
// $argv[0] = 'wk';
$argv[1] = $action;
$argv[2] = $this->option('d') ? '-d' : '';
$this->start();
}
private function start()
{
$this->startGateWay();
$this->startBusinessWorker();
$this->startRegister();
Worker::runAll();
}
private function startBusinessWorker()
{
$worker = new BusinessWorker();
$worker->name = 'BusinessWorker';
$worker->count = 4;
$worker->registerAddress = '127.0.0.1:1236';
$worker->eventHandler = \App\Services\WorkermanService::class;
}
private function startGateWay()
{
$gateway = new Gateway("websocket://0.0.0.0:9004");
$gateway->name = 'Gateway';
$gateway->count = 4;
$gateway->lanIp = '127.0.0.1';
$gateway->startPort = 2300;
$gateway->pingInterval = 30;
$gateway->pingNotResponseLimit = 0;
$gateway->pingData = '{"type":"@heart@"}';
$gateway->registerAddress = '127.0.0.1:1236';
}
private function startRegister()
{
new Register('text://0.0.0.0:1236');
}
}
3. 创建事件监听文件
创建文件 App\Services\WorkermanService.php ,也可以替换为其他文件,修改启动文件中的 eventHandler 即可
<?php
namespace App\Services;
class WorkermanService
{
public static function onWorkerStart($businessWorker)
{
}
public static function onConnect($client_id)
{
}
public static function onWebSocketConnect($client_id, $data)
{
}
public static function onMessage($client_id, $message)
{
}
public static function onClose($client_id)
{
}
}
4. 启动 Workerman 服务端
php artisan workerman start --d
5. windows端 不能同时开启多个协议,必须要分开启动
php artisan workerman single --start=register php artisan workerman single --start=gateway php artisan workerman single --start=worker
6. 可以创建一个 bat 文件直接执行
start /b php artisan workerman single --start=register start /b php artisan workerman single --start=gateway start /b php artisan workerman single --start=worker pause
评论已关闭。