什么是Workerman
Workerman是一款开源高性能异步PHP socket框架。支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。拥有异步Mysql、异步Redis、异步Http、MQTT物联网客户端、异步消息队列等众多高性能组件。
本文介绍workerman实现socket通讯,在此之前请确定你对websocket有所了解
什么是GatewayWorker
GatewayWorker是基于Workerman开发的一套TCP长连接的应用框架, 实现了单发、群发、广播等接口,内置了mysql类库, GatewayWorker分为Gateway进程和Worker进程,天然支持分布式部署,能够支持庞大的连接数(百万甚至千万连接级别的应用)。 可用于开发IM聊天应用、移动通讯、游戏后台、物联网、智能家居后台等等。
安装 gateway-worker
代码语言:javascript复制composer require workerman/gateway-worker
创建命令启动 workerman服务
代码语言:javascript复制php artisan make:command WorkermanCommand
创建的命令存放在 appConsoleCommands 在WorkermanCommand.php键入如下代码
代码语言:javascript复制<?php
namespace AppConsoleCommands;
use GatewayWorkerBusinessWorker;
use GatewayWorkerGateway;
use GatewayWorkerRegister;
use IlluminateConsoleCommand;
use WorkermanWorker;
class WorkermanCommand extends Command
{
protected $signature = 'workman {action} {--d}';
protected $description = 'Start a Workerman server.';
public function handle()
{
global $argv;
$action = $this->argument('action');
$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();
//work名称
$worker->name = 'BusinessWorker';
//businessWork进程数
$worker->count = 2;
//服务注册地址
$worker->registerAddress = '127.0.0.1:1236';
//设置AppWorkermanEvents类来处理业务
$worker->eventHandler = AppWorkermanEvents::class;
}
private function startGateWay()
{
//gateway进程
$gateway = new Gateway("websocket://0.0.0.0:2346");
//gateway名称 status方便查看
$gateway->name = 'Gateway';
//gateway进程
$gateway->count = 2;
//本机ip
$gateway->lanIp = '127.0.0.1';
//内部通讯起始端口,如果$gateway->count = 4 起始端口为2300
//则一般会使用 2300,2301 2个端口作为内部通讯端口
$gateway->startPort = 2300;
//心跳间隔
$gateway->pingInterval = 30;
//客户端连续$pingNotResponseLimit次$pingInterval时间内不发送任何数据则断开链接,并触发onClose。
//我们这里使用的是服务端主动发送心跳所以设置为0
$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');
}
}
可以使用如下命令
- php artisan workman start :启动
- php artisan workman stop:停止
- php artisan workman restart:重启
- php artisan workman reload:平滑重启
- php artisan workman status:查看状态
创建事件监听文件来监听处理 workman 的各种事件。
创建 app/Workerman/Events.php
键入如下代码
代码语言:javascript复制<?php
namespace AppWorkerman;
use GatewayWorkerLibGateway;
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)
{
}
}
启动workerman
运行命令
代码语言:javascript复制php artisan workman start --d
如下界面代表启动workerman启动成功
启动成功后,我们可以利用websocket在线测试工具测试连接
Laravel基本使用workman就介绍到这里,后面会利用workman实现简单聊天功能 移步至【配置wss】【实现聊天】