Laravel中Websocket基本使用(Workerman)
1.安装gateway-worker
composer require workerman/gateway-worker
2.创建命令
php artisan make:command WorkermanCommand
3.创建的命令存放在 app\Console\Commands 在WorkermanCommand.php键入如下代码
<?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 : action} {--start=all : start} {--d : daemon mode}'; 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 = 1; $worker->registerAddress = '127.0.0.1:6001'; $worker->eventHandler = \App\Workerman\Events::class; } private function startGateWay() { $gateway = new Gateway("websocket://0.0.0.0:6002"); $gateway->name = 'Gateway'; $gateway->count = 1; $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:6001'; } private function startRegister() { new Register('text://0.0.0.0:6001'); } }
创建bat文件用于win启动,win无法支持同时启动多个work所以会卡住
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
4.创建事件监听文件来监听处理 workman 的各种事件。 创建 app/Workerman/Events.php
<?php namespace App\Workerman; use \GatewayWorker\Lib\Gateway; class Events { // businessWorker进程启动事件 public static function onWorkerStart($businessWorker) { } //连接事件 public static function onConnect($client_id) { // 向当前client_id发送数据 Gateway::sendToClient($client_id, "Hello $client_id"); } //进程退出事件 public static function onWebSocketConnect($client_id, $data) { } //消息事件 public static function onMessage($client_id, $message) { // 向所有人发送 Gateway::sendToAll("$client_id said $message"); } // 连接断开事件 public static function onClose($client_id) { } }