laravel使用workerman GatewayWorker开启websocket服务
安装workerman
composer require workerman/gateway-worker
composer require workerman/gatewayclient
创建启动文件脚本
php artisan make:command GatewayWorkerServer
文件路径 app/Console/Commands/GatewayWorkerServer.php
<?php
namespace App\Console\Commands;
use App\Http\Controllers\WebsocketController;
use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;
use GatewayWorker\Register;
use Illuminate\Console\Command;
use Workerman\Worker;
class GatewayWorkerServer extends Command
{
protected $signature = 'gateway-worker:server {action} {--daemon}';
protected $description = 'start a workerman server';
public function __construct()
{
parent::__construct();
}
public function handle()
{
global $argv;
if (!in_array($action = $this->argument('action'), ['start', 'stop','reload', 'status','restart'])) {
$this->error('Error Arguments');
exit;
}
$argv[0] = 'gateway-worker:server';
$argv[1] = $action;
$argv[2] = $this->option('daemon') ? '-d' : '';//该参数是以daemon(守护进程)方式启动
$this->start();
}
private function start()
{
$this->startGateWay();
$this->startBusinessWorker();
$this->startRegister();
Worker::runAll();
}
private function startBusinessWorker()
{
$worker = new BusinessWorker();
$worker->name = 'cx-im-worker';
$worker->count = 4;
$worker->registerAddress = '127.0.0.1:2370'; // 该端口可以自定义
$worker->eventHandler = WebsocketController::class; // 该类可以自定义
}
private function startGateWay()
{
$gateway = new Gateway("websocket://0.0.0.0:2375"); // 该端口可以自定义
$gateway->name = 'gateway';
$gateway->count = 2;
$gateway->lanIp = env('LAN_IP','127.0.0.1'); // 该IP为内网ip或者公网ip
$gateway->startPort = 2380; // 该端口为起始端口 如开启多个gateway 则依次递增
$gateway->pingInterval = 30;
$gateway->pingNotResponseLimit = 0;
$gateway->pingData = '{"type":"ping"}';
$gateway->registerAddress = '127.0.0.1:2370'; // 对应gateway的注册地址
}
private function startRegister()
{
new Register('text://0.0.0.0:2370'); // 对应gateway的注册地址
}
}
启动服务命令
php artisan gateway-worker:server start 开启
php artisan gateway-worker:server stop 暂停
php artisan gateway-worker:server reload 重载
php artisan gateway-worker:server status 状态
php artisan gateway-worker:server restart 重启
守护进程模式 --daemon
php artisan gateway-worker:server start --daemon
php artisan gateway-worker:server restart --daemon 重启执行这个即可
<?php
namespace App\Http\Controllers;
use Exception;
use GatewayWorker\Lib\Gateway;
use Illuminate\Support\Facades\Log;
use Workerman\Worker;
class WebsocketController
{
/**
* @param Worker $businessWorker
*/
public static function onWorkerStart(Worker $businessWorker): void
{
echo "BusinessWorker Start\n";
}
/**
* @param $client_id
*/
public static function onConnect($client_id): void
{
echo "onConnect {$client_id}\n";
}
/**
* @param $client_id
* @param $data
* @throws Exception
*/
public static function onWebSocketConnect($client_id, $data): void
{
//var_export($data);
// 握手成功后设置连接的onMessage回调
}
/**
* @param $client_id
* @param $data
* @return void
* @throws Exception
*/
public static function onMessage($client_id, $data): void
{
// 接收到消息处理
//var_export($data);
}
/**
* @param $client_id
* @throws Exception
*/
public static function onClose($client_id): void
{
// 从客户端的连接池删除
}
/**
* onWorkerStop 事件回调
* 当businessWorker进程退出时触发。每个进程生命周期内都只会触发一次。
* @param Worker $businessWorker
* @return void
*/
public static function onWorkerStop(Worker $businessWorker): void
{
echo "WorkerStop\n";
}
}