⚡ ThinkPlugsWorker
ThinkPlugsWorker 是基于 Workerman 4.x 且支持多种通信协议的基础插件,提供高性能的 Web 服务解决方案。
🚀 主要功能
- HTTP 服务: 直接启动 ThinkAdmin 项目,无需 Nginx 或 Apache
- 性能提升: 访问速度提升数倍,支持高并发访问
- 多协议支持: 支持 HTTP、WebSocket、TCP 等多种协议
- 进程管理: 完善的进程管理和监控功能
- 热更新: 支持代码热更新,无需重启服务
- 负载均衡: 支持多进程负载均衡
⚙️ 运行方式
Workerman 模式
- 默认运行方式,基于 Workerman 4.x
- 支持 HTTP 协议直接运行 ThinkAdmin
- 无需额外配置 Web 服务器
- 高性能异步处理
- 支持多进程负载均衡
Gateway 模式
- 需要单独安装 Gateway 组件
- 支持 WebSocket 等实时通信协议
- 适用于实时应用场景
- 支持分布式部署
- 提供消息广播功能
自定义协议模式
- 支持自定义通信协议
- 可扩展多种业务场景
- 灵活配置服务参数
- 支持多种监听方式
📋 配置说明
默认配置
- 根配置参数启动 HTTP 服务进程
- 用于运行 ThinkAdmin v6 程序
- 支持自定义端口和域名配置
自定义协议
- 使用
customs
配置定义其他协议 - 通过
--custom name
启动对应服务 - 支持多种通信协议同时运行
加入我们
我们的代码仓库已移至 Github,而 Gitee 则仅作为国内镜像仓库,方便广大开发者获取和使用。若想提交 PR 或 ISSUE 请在 ThinkAdminDeveloper 仓库进行操作,如果在其他仓库操作或提交问题将无法处理!。
标准安装
### 安装前建议尝试更新所有组件
composer update --optimize-autoloader
### 注意,插件仅支持在 ThinkAdmin v6.1 中使用
composer require zoujingli/think-plugs-worker --optimize-autoloader
定制安装
- 复制插件 ThinkPlugsWorker 所有源代码到
plugin/think-plugs-worker
目录。 - 修改插件
composer.json
文件追加version
配置项,插件 ThinkPlugsWorker 的完整配置如下:
{
"type": "think-admin-plugin",
"name": "zoujingli/think-plugs-worker",
"version": "1.0.0",
"license": "Apache-2.0",
"homepage": "https://thinkadmin.top",
"description": "Workerman HttpServer for ThinkAdmin",
"authors": [
{
"name": "Anyon",
"email": "zoujingli@qq.com"
}
],
"require": {
"php": ">7.1",
"workerman/workerman": "^4.1",
"zoujingli/think-install": "^1.0|@dev",
"zoujingli/think-library": "^6.1|@dev"
},
"autoload": {
"psr-4": {
"plugin\\worker\\": "src"
}
},
"extra": {
"think": {
"services": [
"plugin\\worker\\Service"
]
},
"config": {
"type": "service",
"name": "基于 Workerman 的通信服务",
"document": "https://thinkadmin.top/plugin/think-plugs-worker.html",
"license": [
"Apache-2.0"
]
},
"plugin": {
"init": {
"stc/worker.php": "config/worker.php"
},
"event": {
"src/Script.php": "plugin\\worker\\Script"
}
}
}
}
- 修改项目根
composer.json
配置,增加 ThinkPlugsWorker 插件本地化路径配置,完整配置如下:
{
"type": "project",
"name": "zoujingli/thinkadmin",
"license": "MIT",
"homepage": "https://thinkadmin.top",
"description": "Application Development Framework",
"keywords": [
"ThinkAdmin",
"ThinkLibrary",
"WeChatDeveloper"
],
"authors": [
{
"name": "Anyon",
"email": "zoujingli@qq.com"
}
],
"require": {
"php": ">7.1",
"ext-gd": "*",
"ext-json": "*",
"ext-openssl": "*",
"zoujingli/think-plugs-admin": "^1.0",
"zoujingli/think-plugs-worker": "^1.0"
},
"repositories": [
{
"type": "path",
"url": "plugin/think-plugs-worker"
}
],
"config": {
"sort-packages": true,
"allow-plugins": {
"zoujingli/think-install": true
}
}
}
- 在项目根目录终端执行
composer update
完成安装。
卸载插件
composer remove zoujingli/think-plugs-worker
配置参数
配置文件 config/worker.php
return [
// 服务监听地址
'host' => '127.0.0.1',
// 服务监听端口
'port' => 2346,
// 套接字上下文选项
'context' => [],
// 高级自定义服务类
'classes' => '',
// 消息请求回调处理
'callable' => null,
// 服务进程参数配置
'worker' => [
// 进程名称
"name" => 'ThinkAdmin',
// 进程数量
'count' => 4,
],
// 监控文件变更重载
'files' => [
// 监控检测间隔(单位秒,零不监控)
'time' => 3,
// 文件监控目录(默认监控 app+config 目录)
'path' => [],
// 文件监控后缀(默认监控 所有 文件)
'exts' => ['*']
],
// 监控内存超限重载
'memory' => [
// 监控检测间隔(单位秒,零不监控)
'time' => 60,
// 限制内存大小(可选单位有 G M K )
'limit' => '1G'
],
// 自定义服务配置(可选)
'customs' => [
// 自定义 text 服务
'text' => [
// 进程类型(Workerman|Gateway|Register|Business)
'type' => 'Workerman',
// 监听地址(<协议>://<地址>:<端口>)
'listen' => 'text://0.0.0.0:8685',
// 高级自定义服务类
'classes' => '',
// 套接字上下文选项
'context' => [],
// 服务进程参数配置
'worker' => [
//'name' => 'TextTest',
// onWorkerStart => [class,method]
// onWorkerReload => [class,method]
// onConnect => [class,method]
// onBufferFull => [class,method]
// onBufferDrain => [class,method]
// onError => [class,method]
// 设置连接的 onMessage 回调
'onMessage' => function ($connection, $data) {
$connection->send("hello world");
}
]
],
// 自定义 websocket 服务
'websocket' => [
// 进程类型(Workerman|Gateway|Register|Business)
'type' => 'Workerman',
// 监听地址(<协议>://<地址>:<端口>)
'listen' => 'websocket://0.0.0.0:8686',
// 高级自定义服务类
'classes' => '',
// 套接字上下文选项
'context' => [],
// 服务进程参数配置
'worker' => [
//'name' => 'TextTest',
// onWorkerStart => [class,method]
// onWorkerReload => [class,method]
// onConnect => [class,method]
// onBufferFull => [class,method]
// onBufferDrain => [class,method]
// onError => [class,method]
// 设置连接的 onMessage 回调
'onMessage' => function ($connection, $data) {
$connection->send("hello world");
}
]
],
// 自定义 Gateway 服务
'gateway' => [
// 进程类型(Workerman|Gateway|Register|Business)
'type' => 'Gateway',
// 监听地址(<协议>://<地址>:<端口>)
'listen' => 'websocket://127.0.0.1:8689',
// 高级自定义服务类
'classes' => '',
// 套接字上下文选项
'context' => [],
// 服务进程参数配置
'worker' => [
// 进程名称
"name" => 'Gateway',
// 进程数量
"count" => 4,
// 心跳发送时间,针对客户端
'pingInterval' => 10,
// 心跳容错次数,针对客户端
'pingNotResponseLimit' => 0,
// 心跳包内容,针对客户端
'pingData' => '{"type":"ping"}',
// 服务器内网IP
"lanIp" => '127.0.0.1',
// Business 回复 Gateway 端口
"startPort" => 2000,
// 注册服务地址,与 Register 进程对应
"registerAddress" => '127.0.0.1:1236',
// 进程启动回调
"onWorkerStart" => function () {
echo "Gateway onWorkerStart" . PHP_EOL;
},
// 进程停止回调
"onWorkerStop" => function () {
echo "Gateway onWorkerStop" . PHP_EOL;
}
]
],
// 自定义 Register 服务
'register' => [
// 进程类型(Workerman|Gateway|Register|Business)
'type' => 'Register',
// 监听地址(<协议>://<地址>:<端口>)
// 注意:别改这里的协议,只支持 text 协议
'listen' => 'text://127.0.0.1:1236'
],
// 自定义 Business 服务
'business' => [
// 进程类型(Workerman|Gateway|Register|Business)
'type' => 'Business',
// 高级自定义服务类
'classes' => '',
// 服务进程参数配置
'worker' => [
// 进程名称
"name" => 'Business',
// 进程数量
"count" => 4,
// 注册服务地址,与 Register 进程对应
"registerAddress" => '127.0.0.1:1236',
// 业务处理类
"eventHandler" => Events::class,
// 进程启动回调
"onWorkerStart" => function () {
echo "Business onWorkerStart" . PHP_EOL;
},
// 进程停止回调
"onWorkerStop" => function () {
echo "Business onWorkerStart" . PHP_EOL;
}
]
],
],
];
/**
* 业务处理类
* @class Events
*/
class Events
{
/**
* 业务进程启动
* @param $businessWorker
* @return void
*/
public static function onWorkerStart($businessWorker)
{
echo "Events WorkerStart\n";
}
/**
* 有消息时触发该方法
* @param int $clientid 发消息的client_id
* @param mixed $message 消息
* @throws \Exception
*/
public static function onMessage($clientid, $message)
{
// 群聊,转发请求给其它所有的客户端
\GatewayWorker\Lib\Gateway::sendToAll("Message By Events : {$message}");
}
}
使用方法
在命令行启动服务端
#========= 启动参数配置 =========
### 守护方式运行 -d
### 指定监听域名 --host 127.0.0.1
### 指定监听端口 --port 2346
### 启动指定服务 --custom websocket
# 通过 Workerman 方式,启动默认 Http 服务
php think xadmin:worker
# 通过 Workerman 方式,启动自定义 text 服务,注意 text 为 customs 配置项
php think xadmin:worker --custom text
# 通过 Workerman 方式,启动自定义 WebSocket 服务,注意 websocket 为 customs 配置项
php think xadmin:worker --custom websocket
# 通过 Gateway 方式,需要同时启动三个进程,另外还需要安装 workerman/gateway-worker 依赖包。
# 具体业务处理逻辑写在 business 绑定的 Events 中,了解更新多配置请阅读 Workerman 官方文档。
php think xadmin:worker --custom register
php think xadmin:worker --custom gateway
php think xadmin:worker --custom business
然后就可以通过浏览器直接访问当前应用
http://localhost:2346
默认使用 Workerman
工作方式,如果需要使用 Gateway
方式,需要安装 GatewayWorker
组件。
安装 GatewayWorker
的指令如下:
# 安装 GatewayWorker 组件
composer require workerman/gateway-worker
注意: 启用 Gateway
时需要单独启动三个进程,分别是 Gateway
、Register
、Business
,中间需要 Register
进程连接。
数据通信模型:
Client
<->
Gateway
<->
Register
<->
Business
<->
Events
Linux 支持操作指令如下:
php think xadmin:worker [start|stop|reload|restart|status|-d]
# 以上所有操作效果与 Workerman 官方操作一致,详情请阅读对应文档。
Windows 支持操作指令如下:
php think xadmin:worker [start|stop|status|-d]
# 以上 stop|status|-d 操作是基于 wimc 实现,Workerman 官方不支持此种方式操作。
其他 workerman 的参数可以在应用配置目录下的 worker.php 里面 worker 项配置。
更多其他特性请阅读 workerman 文档 https://www.workerman.net/doc/workerman
版权说明
ThinkPlugsWorker 遵循 Apache2 开源协议发布,并提供免费使用。
本项目包含的第三方源码和二进制文件之版权信息另行标注。
版权所有 Copyright © 2014-2024 by ThinkAdmin (https://thinkadmin.top) All rights reserved。