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)
- {
- }
- }