laravel引入GatewayWorker开发webscoket项目
GatewayWorker是基于workerman的分布式即时通讯框架
可以开发物联网,即时聊天等应用.支持tcp websocket等长链接协议
缺点是没有数据库操作类,控制器,验证类等.都要自己写
这个文章是适合有GatewayWorker使用经验的开发者.
在laravel框架新建一个自定义命令行
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;
use GatewayWorker\Register;
use Workerman\Worker;
class WorkermanCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'workman {action} {d?}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Start a Workerman server.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
global $argv;
$action = $this->argument('action');
$argv[0] = 'wk';
$argv[1] = $action;
if($this->argument('d')){
$argv[2]="-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:1238';
$worker->eventHandler = \App\Workerman\Events::class;
}
private function startGateWay()
{
$gateway = new Gateway("websocket://0.0.0.0:8585");
// gateway名称,status方便查看
$gateway->name = 'YourAppGateway';
// gateway进程数,一般设置2个就足够
$gateway->count = 2;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=2,起始端口为2900
// 则一般会使用2900 2901 2个端口作为内部通讯端口
$gateway->startPort = 2900;
// 服务注册地址
$gateway->registerAddress = '127.0.0.1:1238';
// 心跳间隔,客户端多久不发心跳就断开
$gateway->pingInterval = 60;
//是否允许客户端不发心跳
$gateway->pingNotResponseLimit = 1;
// 心跳数据
$gateway->pingData = '{"type":"ping"}';
}
private function startRegister()
{
new Register('text://0.0.0.0:1238');
}
}
在App\Workerman目录新建;
Events.php
<?php
namespace App\Workerman;
use App\Exceptions\BusinessExceptions;
use \GatewayWorker\Lib\Gateway;
class Events
{
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)
{
//接收$message
// 这里可以做路由分发实例化对应的类和方法
//实例化具体的控制器和方法,返回json类型的数据
Gateway::sendToClient($client_id, json_encode($res,JSON_UNESCAPED_UNICODE));
}
public static function onClose($client_id)
{
}
}
例如
请求的内容
{
"type":"v1/my/get"
}
可以转化成调用 Logic目录下的
v1/MyLogic.php的function get()
namespace App\Http\Logic\v1;
class Mylogic{
function get(){
return ['code'=>1,"message"=>"mesages","data"=>[]]
}
}
其他的方面和laravel用法差不多.不能使用laravel框架的session,可以使用GatewayWorker的session
启动命令
启动(开发模式)
php artisan workman start
启动
php artisan workman start d
停止
php artisan workman stop
重启
php artisan workman restart
同理也可以引入到thinkphp和webman
本作品采用《CC 协议》,转载必须注明作者和本文链接