From 187a08a621f5bced89952c1935041de6b0177e9b Mon Sep 17 00:00:00 2001 From: jerry Date: Mon, 18 Jan 2021 18:08:29 +0800 Subject: [PATCH] =?UTF-8?q?update=20to=202.1.6=20version=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9B=B4=E5=A4=9A=E6=8F=90=E7=A4=BA=E8=AF=AD=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=84=E7=90=86=E7=A9=BA=E6=A0=BC=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=97=B6=E7=9A=84=E6=8A=A5=E9=94=99=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=B8=8A=E4=B8=8B=E6=96=87=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/start | 22 +- composer.json | 2 +- docs/advanced/connect-ws-client.md | 143 +++++++++++ docs/advanced/custom-start.md | 107 ++++++++ docs/advanced/framework-structure.md | 6 + docs/advanced/index.md | 10 +- docs/assets/img/framework-structure.png | Bin 0 -> 96464 bytes docs/component/console.md | 18 +- docs/component/context.md | 2 +- docs/event/framework-annotations.md | 309 ++++++++++++++++++++++-- docs/javascripts/config.js | 4 +- mkdocs.yml | 3 + src/Module/Example/Hello.php | 4 +- src/ZM/Command/InitCommand.php | 1 + src/ZM/ConsoleApplication.php | 1 + src/ZM/Context/ContextInterface.php | 2 + src/ZM/Event/EventManager.php | 2 +- src/ZM/Event/ServerEventHandler.php | 2 +- src/ZM/Module/QQBot.php | 1 + 19 files changed, 594 insertions(+), 45 deletions(-) create mode 100644 docs/advanced/connect-ws-client.md create mode 100644 docs/advanced/custom-start.md create mode 100644 docs/advanced/framework-structure.md create mode 100644 docs/assets/img/framework-structure.png diff --git a/bin/start b/bin/start index 5a518c8f..ebb92c7f 100755 --- a/bin/start +++ b/bin/start @@ -1,28 +1,14 @@ #!/usr/bin/env php initEnv(); -$application->run(); + +(new ZM\ConsoleApplication("zhamao-framework"))->initEnv()->run(); diff --git a/composer.json b/composer.json index e1ae4c52..788f9497 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "description": "High performance QQ robot and web server development framework", "minimum-stability": "stable", "license": "Apache-2.0", - "version": "2.1.5", + "version": "2.1.6", "extra": { "exclude_annotate": [ "src/ZM" diff --git a/docs/advanced/connect-ws-client.md b/docs/advanced/connect-ws-client.md new file mode 100644 index 00000000..ea08148d --- /dev/null +++ b/docs/advanced/connect-ws-client.md @@ -0,0 +1,143 @@ +# 接入 WebSocket 客户端 + +炸毛框架其实从本质上讲,就是一个 HTTP + WebSocket 服务器,所以框架也支持对接其他任何 HTTP 客户端和 WebSocket 客户端,实际上炸毛框架非常适合用 WebSocket 做在线的 IM 聊天通讯,也可以方便地进行 WS 通信。这里主要说明如何对接一个自定义的 WebSocket 客户端。 + +## 类型指定 + +由于 WebSocket 连接都具有同样的性质,没有状态,所以在建立 WebSocket 连接的时候,需要客户端表明自己的身份和类型。指定客户端连接类型的方式有两种: + +- `GET` 参数传递,在连接的时候,加上 GET 参数 `type` 即可。比如 js 中 WebSocket 建立时地址写:`ws://127.0.0.1:20001/?type=foo`,这时传入的连接就是 `foo` 类型。 +- `Header` 传递,用户需要在建立连接时指定 HTTP 的头部信息 `X-Client-Role`,例如 `X-Client-Role: foo`,这时传入的连接就是 `foo` 类型。 + +以上两种方式,`Header` 方式比 `GET` 方式优先级要高,如果两者均没有指定,框架会将此连接当作 `default` 类型接入。 + +!!! note "提示" + + 对于对接 OneBot 标准的机器人客户端,只要符合 OneBot 标准,即 `X-Client-Role` 会自动带上 `universal`、`qq` 等字样,就会自动标记为 `qq` 类型。 + +## 逻辑编写 + +传入连接后,我们就能通过注解事件绑定来做我们自己想做的事情了!比如下方是传入类型为 foo 连接要做的事情 + +```php +getName()." 已连接!"); + } +``` + +以上作用就是在终端输出 `foo 已连接!` 这个提示的。关于 `ConnectionObject` 对象,见下方。 + +## WS 连接对象 + +对于每一个 WebSocket 连接,框架内都有一个专属的操作类,有获取类型名称、保存链接参数和属性以及获取文件标识符等功能。 + +### getFd() + +获取文件标示符,用于发送消息、接收消息等。这个参数获取的 `fd` 是 Swoole 指定的,用于发送信息等。 + +```php +$fd = $conn->getFd(); +server()->send($fd, "hello world"); +``` + +> WebSocket 是全双工的,所以发送和接收其实是互不干扰的,你可以不仅仅在 WebSocket 相关的上下文中,还可以比如在 HTTP 或者机器人上下文中给别的 WebSocket 客户端发请求。 + +### getName() + +获取连接对象绑定的连接类型,例如上方提到的 `foo`、`default` 等。 + +```php +Console::info("当前连接类型:".$conn->getName()); //当前连接类型:foo +``` + +### setName() + +改变连接对象绑定的连接类型,例如从 `foo` 改为 `bar`。 + +```php +$s = $conn->getName(); // foo +$conn->setName("bar"); +$s = $conn->getName(); // bar +``` + +### getOptions() + +获取此连接存储的所有参数,以数组形式。存储内容见下方 `setOption()`。 + +格式:`["参数1" => {参数1的值}, "参数2" => {参数2的值}]` + +### getOption() + +获取此连接存储的参数,获取指定名称的,此方法拥有一个参数 `$key`,指定即可获取。 + +如果没有对应参数,则返回 `null`。 + +我们在前面的机器人部分知道,框架主要是用于机器人的连接,那么机器人客户端在连接后,比如我们想知道这个机器人的 WS 连接对应的是哪个 QQ 号的机器人,我们就可以用 `getOption("connect_id")` 来获取。这个 `connect_id` 是 OneBot 标准的客户端接入后自动填入的一个参数。例如,我们想在机器人接入后打出接入机器人的 QQ 号: + +```php +/** + * @OnOpenEvent("qq") + */ +public function onQQConnect($conn) { + Console::success("机器人 ".$conn->getOption("connect_id")." 已连接!"); // 机器人 123456 已连接! +} +``` + +### setOption() + +设置连接存储的参数。参数:`setOption($key, $value)`。`$key` 限定为 `connect_id` 一种。(因为目前有了 LightCache,所以这里暂时不提供别的 key 设定) + +```php +$conn->setOption("connect_id", "asdasdasd"); // $value 最长长度为 29 +``` + +## 发送到 WebSocket 客户端 + +很简单,从上面获取到 `fd` 后使用下面的方式就可以了~ + +```php +server()->push($conn->getFd(), "hello"); // 第二个为 string 类型的参数 +``` + +## 从客户端接收 + +接收消息必须从 `@OnMessageEvent` 注解事件下接收,使用上下文 `ctx()->getFrame()` 获取消息帧。 + +从这里获取的 `Frame` 对象,见 [Swoole 文档 - Frame](https://wiki.swoole.com/#/websocket_server?id=swoolewebsocketframe)。 + +Frame 对象有四个参数: + +- `$frame->fd`:获取发来帧的 fd +- `$frame->data`:数据本体 +- `$frame->opcode`:数据类型 int 值,见 [Swoole 文档 - 数据帧类型](https://wiki.swoole.com/#/websocket_server?id=%e6%95%b0%e6%8d%ae%e5%b8%a7%e7%b1%bb%e5%9e%8b) +- `$frame->finish`:是否发送完毕,bool + +下面以接收一个 json 字符串为例,并进行后续的解析: + +```php +/** + * @OnMessageEvent("foo") + */ +public function onMessage() { + $frame = ctx()->getFrame(); + $json_str = $frame->data; // 假设传入的是 {"key1":"value1","k2":"v2"} + $json = json_decode($json_str, true); + Console::info("key1 的值是:" . $json["key1"]); +} +``` + +## 关闭连接 + +```php +server()->close($conn->getFd()); +``` + diff --git a/docs/advanced/custom-start.md b/docs/advanced/custom-start.md new file mode 100644 index 00000000..369edbc7 --- /dev/null +++ b/docs/advanced/custom-start.md @@ -0,0 +1,107 @@ +# 框架高级启动 + +## 框架下载方式 + +从前面的几章中,我们了解到框架有多种下载到本地的方式。 + +- Composer 依赖模式 +- Starter 从模板创建模式 +- 源码模式 + +### Composer 依赖模式 + +从 Composer 依赖加载框架是一种拉取框架的方式,这种方式的优点在于,你可以直观地感受到是如何使用框架从零开始一个完整的项目的过程。 + +从 Composer 依赖的启动步骤: + +```bash +mkdir my-bot # 新建一个空的文件夹 +cd my-bot/ +composer require zhamao/framework # 从 composer 拉取后会自动部署 autoload 和 composer.json 等内容 + +# 使用命令初始化框架 +vendor/bin/start init + +# 启动框架 +vendor/bin/start server +``` + +注意:使用 `init` 命令时,会给当前目录解压以下文件: + +```php +$extract_files = [ + "/config/global.php", // 全局配置文件 + "/.gitignore", // git 排除文件 + "/config/file_header.json", // HTTP 文件头 + "/config/console_color.json", // 终端颜色主题文件 + "/config/motd.txt", // 框架启动时自定义的 motd + "/src/Module/Example/Hello.php", // 框架自带的示例模块 + "/src/Module/Middleware/TimerMiddleware.php", // 框架自带的函数运行时间监控中间件 + "/src/Custom/global_function.php" // 用户可在这里自定义编写自己的全局函数 +]; +``` + +经过 init 解压这些文件后,你的框架就能正常运行且开始编写代码了! + +### Starter 模板模式 + +从模板新建其实原理和 Composer 依赖模式完全一样,只不过,这个过程是使用模板仓库新建的项目,使用 Composer 自带的 `create-project` 方式创建的。starter 也是一个 GitHub 项目,见 [地址](https://github.com/zhamao-robot/zhamao-framework-starter)。 + +```bash +composer create-project zhamao/framework-starter my-bot/ # my-bot 是你自定义的文件夹名称,和上方相同 +cd my-bot +vendor/bin/start server # 启动框架 +``` + +Starter 模式相当于直接从 GitHub 拉取 `zhamao-framework-starter` 项目,然后执行 `composer update`。 + +那和 Composer 依赖模式有什么区别呢?没区别!构建出来的框架和文件是一模一样的!使用 Composer 依赖模式,使用 `init` 命令后,文件会和 `zhamao-framework-starter` 仓库拉取回来的模板一模一样!(或者换句话说,这个仓库就是使用 `init` 命令生成的文件的) + +那使用哪种好呢?看你自己!如果你想给你自己的已有项目套上炸毛框架,那么就推荐使用 Composer 依赖模式,如果是从 0 开始编写框架模块,则推荐使用模板模式。 + +### 源码模式 + +源码模式和以上两种方案都不一样,源码模式允许你对框架本身进行一系列修改,框架本体就可以直接运行。 + +Composer 依赖模式(以及模板模式)和源码模式的区别是: + +- 依赖模式和模板模式是通过 library 方式引入框架的,框架本身会放在 composer 的 `vendor/` 目录下,从 composer 引入的 library 相当于子集,vendor 目录下的文件最好不要手动修改(应该都知道吧),所以框架本身也只是加载了进来。 +- 源码模式相当于直接从框架源码目录运行框架和模块,框架源码都在 `src/ZM` 目录下,默认的示例模块都在 `src/Module` 下,是同级目录。而此时的 `vendor/` 目录只包含了框架依赖的外部组件,例如注解解析器和 psysh 等。 + +源码模式可以方便地调试和修改框架本身,拉取方式很简单,用 `git clone` 或从 GitHub 下载最新版的源码包解压即可。 + +```bash +git clone https://github.com/zhamao-robot/zhamao-framework.git +cd zhamao-framework/ +bin/start server # 第一次运行时会提示一个“框架源码模式需要在autoload文件中添加Module目录为自动加载” +composer update # 更新 autoload 文件,应用刚才上一步添加的 `src/Module` 文件夹下的模块自动加载 +bin/start server # 通过源码模式启动框架 +``` + +## 框架启动参数 + +框架启动时可以根据实际情况指定启动参数。 + +- `--debug-mode`:启用调试模式,调试模式的作用是关闭一键协程化和终端交互,减少 Swoole 本身对代码逻辑的干扰(比如执行 `shell_exec()` 报错的话可以开启这个进行调试)。 +- `--log-{mode}`:设置 log 等级。支持 `--log-debug`,`--log-verbose`,`--log-info`,`--log-warning`,`--log-error`。 +- `--log-theme`:设置终端信息的主题。这个选项适用于多种终端信息显示的兼容,例如白色终端和不支持颜色的终端。详见 [Console - 主题设置](/component/console/#_2)。 +- `--disable-console-input`:关闭终端交互,如果你使用的不是 tmux、screen 而是直接将进程使用 systemd 等方式运行到 init 守护进程下,则需要关闭终端交互输入,关闭后不可以使用 `stop, reload, logtest` 等交互命令。 +- `--disable-coroutine`:关闭一键协程化。 +- `--daemon`:以守护进程方式运行框架,此参数将直接在输出 motd 后将进程挂到 init 下运行,后台常驻。 +- `--watch`:监控 `src/` 目录下的文件变化,有变化则自动重新载入代码。开启监控需要安装 PHP 扩展:inotify。使用 pecl 就可以安装:`pecl install inotify`。 +- `--env`:设置运行环境,设置运行环境后将优先加载指定环境的配置文件,支持 `--env=production`,`--env=staging`,`--env=development`,见 [基本配置](/guide/basic-config/#_2)。 + +## 独立启动其他组件 + +框架默认不止启动框架的 `server` 命令,还有 `init` 命令和 `simple-http-server` 命令。`init` 命令在上方 Composer 依赖模式中提到过,就是初始化各个文件的。 + +### 独立 HTTP 文件服务器 + +如果你只需要一个静态文件服务器,类似 Nginx,那么框架也支持。 + +```bash +vendor/bin/start simple-http-server your-web-dir/ --host=0.0.0.0 --port=8080 +``` + +- `your-web-dir` 是必填的参数。 +- `--host` 和 `--port` 是可选参数,如果不填,则默认使用 `global.php` 配置文件中的配置。 \ No newline at end of file diff --git a/docs/advanced/framework-structure.md b/docs/advanced/framework-structure.md new file mode 100644 index 00000000..8511afc1 --- /dev/null +++ b/docs/advanced/framework-structure.md @@ -0,0 +1,6 @@ +# 框架剖析 + +## 框架运行总结构图 + +![](../assets/img/framework-structure.png) + diff --git a/docs/advanced/index.md b/docs/advanced/index.md index fa8e1a9d..06229b11 100644 --- a/docs/advanced/index.md +++ b/docs/advanced/index.md @@ -1,3 +1,9 @@ # 进阶开发 -## 深入 -还没填坑,敬请期待! \ No newline at end of file +在本章,下面的部分将详细说明一些具体的案例和自定义框架的操作。 + +- 如何自定义修改框架本身?- [框架启动方式](/advanced/custom-start/) +- 如何接入一个自己的 WebSocket 客户端?- [接入 WebSocket 客户端](/advanced/connect-ws-client/) +- 框架到底是怎么工作的?- [框架结构剖析](/advanced/framework-structure/) + +> 更多进阶教程敬请期待....(或者你可以选择提 Issue 到框架 GitHub,有需求就写入文档) + diff --git a/docs/assets/img/framework-structure.png b/docs/assets/img/framework-structure.png new file mode 100644 index 0000000000000000000000000000000000000000..6a59290eb51f9eec2038623010739fec07cefced GIT binary patch literal 96464 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 literal 0 HcmV?d00001 diff --git a/docs/component/console.md b/docs/component/console.md index f1d2fff1..23606f03 100644 --- a/docs/component/console.md +++ b/docs/component/console.md @@ -158,4 +158,20 @@ color green 我是绿色的字 在 1.4 版本开始,框架支持启动时的 motd 内容修改。 -文件位置:`config/motd.txt` \ No newline at end of file +文件位置:`config/motd.txt` + +## 设置输出主题 + +Console 组件支持为多种不同的终端设置不同的主题,比如有些人喜欢使用白色的终端,但是白色终端下 info 的颜色很浅,看不到,还有人使用不能显示颜色的黑白终端..... + +```bash +vendor/bin/start server --log-theme={主题名} +``` + +现有支持的主题有:`default`,`white-term`,`no-color` + +```bash +vendor/bin/start server --log-theme=white-term # 如果用的是白色终端,这个主题更友好 +vendor/bin/start server --log-theme=no-color # 如果不想让 log 带有任何颜色,使用无色主题 +``` + diff --git a/docs/component/context.md b/docs/component/context.md index e4db3258..8d0629db 100644 --- a/docs/component/context.md +++ b/docs/component/context.md @@ -114,7 +114,7 @@ public function ping() { ## getConnection() - WS 连接对象 -返回此上下文相关联的 WebSocket 连接对象。 +返回此上下文相关联的 WebSocket 连接对象。详见 [进阶 - 接入 WebSocket 客户端](/advanced/connect-ws-client)。 可以使用的事件:所有 **getFrame()** 可以使用的都可以使用。 diff --git a/docs/event/framework-annotations.md b/docs/event/framework-annotations.md index 242e51b3..908ff9ed 100644 --- a/docs/event/framework-annotations.md +++ b/docs/event/framework-annotations.md @@ -2,20 +2,133 @@ 框架核心注解事件区别于机器人和路由注解事件,这里框架注解事件都是**直接**或封装调用 Swoole 的回调事件的,所以对一些比较底层或者基础的操作都在这里做,例如收到 HTTP 或 WebSocket 连接后执行的事件函数。 -## OnSwooleEvent() +## OnOpenEvent() -绑定 Swoole 所相关的事件,例如 WebSocket 接入、收到 WS 消息、关闭 WS 连接,HTTP 请求到达等。这个是旧的统一的 Swoole 事件分发注解。请尽量使用上面几个新的注解。 +当有 WebSocket 连接接入框架时,触发注解事件。 ### 属性 -| 类型 | 值 | -| ------------ | ------------------------------------------ | -| 名称 | `@OnSwooleEvent` | -| 触发前提 | 当参数指定的 `type` 对应的事件被触发后激活 | -| 命名空间 | `ZM\Annotation\Swoole\OnSwooleEvent` | -| 适用位置 | 方法 | -| 返回值处理 | 无 | -| 注解绑定参数 | | +| 类型 | 值 | +| ---------- | ------------------------------------------- | +| 名称 | `@OnOpenEvent` | +| 触发前提 | 当有 WebSocket 连接接入框架时,触发注解事件 | +| 命名空间 | `ZM\Annotation\Swoole\OnOpenEvent` | +| 适用位置 | 方法 | +| 返回值处理 | 无 | + +### 参数 + +| 参数名称 | 参数范围 | 用途 | 默认 | +| ------------ | -------- | ------------------------------------------------------------ | ---- | +| connect_type | `string` | 限定连接的类型,通过炸毛框架支持的方式指定传入类型,详见 [进阶 - 接入 WebSocket 客户端](/advanced/connect-ws-client) | | + +### 用法 + +```java +@OnOpenEvent("foo") +@OnOpenEvent(connect_type="default") +``` + +### 事件绑定参数 + +`$conn`: [ConnectionObject](/advanced/connect-ws-client/) 类型,返回一个当前 WS 连接的连接对象。 + +## OnCloseEvent() + +当有 WebSocket 连接断开框架时,触发注解事件。 + +### 属性 + +| 类型 | 值 | +| ---------- | ------------------------------------------- | +| 名称 | `@OnCloseEvent` | +| 触发前提 | 当有 WebSocket 连接断开框架时,触发注解事件 | +| 命名空间 | `ZM\Annotation\Swoole\OnCloseEvent` | +| 适用位置 | 方法 | +| 返回值处理 | 无 | + +### 参数 + +| 参数名称 | 参数范围 | 用途 | 默认 | +| ------------ | -------- | ------------------------------------------------------------ | ---- | +| connect_type | `string` | 限定连接的类型,通过炸毛框架支持的方式指定传入类型,详见 [进阶 - 接入 WebSocket 客户端](/advanced/connect-ws-client) | | + +### 用法 + +```java +@OnCloseEvent("foo") +@OnCloseEvent(connect_type="default") +``` + +### 事件绑定参数 + +`$conn`: [ConnectionObject](/advanced/connect-ws-client/) 类型,返回一个当前 WS 连接的连接对象。 + +## OnRequestEvent() + +当 HTTP 请求接入时,触发注解事件。 + +### 属性 + +| 类型 | 值 | +| ---------- | ------------------------------------- | +| 名称 | `@OnRequestEvent` | +| 触发前提 | 当 HTTP 请求接入时,触发注解事件 | +| 命名空间 | `ZM\Annotation\Swoole\OnRequestEvent` | +| 适用位置 | 方法 | +| 返回值处理 | 无 | + +### 参数 + +| 参数名称 | 参数范围 | 用途 | 默认 | +| -------- | --------------------------------------------- | ------------------------ | ---------------- | +| rule | `string`,必须是可执行且返回 bool 的 PHP 代码 | 前置条件 | 空,rule 为 true | +| level | `int` | 事件优先级(越大越靠前) | 20 | + +## OnMessageEvent() + +当有 WebSocket 连接接入框架后发送过来消息,触发注解事件。 + +### 属性 + +| 类型 | 值 | +| ---------- | ------------------------------------------------------- | +| 名称 | `@OnMessageEvent` | +| 触发前提 | 当有 WebSocket 连接接入框架后发送过来消息,触发注解事件 | +| 命名空间 | `ZM\Annotation\Swoole\OnMessageEvent` | +| 适用位置 | 方法 | +| 返回值处理 | 无 | + +### 参数 + +| 参数名称 | 参数范围 | 用途 | 默认 | +| ------------ | -------- | ------------------------------------------------------------ | ---- | +| connect_type | `string` | 限定连接的类型,通过炸毛框架支持的方式指定传入类型,详见 [进阶 - 接入 WebSocket 客户端](/advanced/connect-ws-client) | | + +### 用法 + +```java +@OnMessageEvent("foo") +@OnMessageEvent(connect_type="default") +``` + +### 事件绑定参数 + +`$conn`: [ConnectionObject](/advanced/connect-ws-client/) 类型,返回一个当前 WS 连接的连接对象。 + +## OnSwooleEvent() + +绑定 Swoole 所相关的事件,例如 WebSocket 接入、收到 WS 消息、关闭 WS 连接,HTTP 请求到达等。这个是旧的统一的 Swoole 事件分发注解。**请尽量使用上面几个新的注解**。 + +### 属性 + +| 类型 | 值 | +| ---------- | ------------------------------------------ | +| 名称 | `@OnSwooleEvent` | +| 触发前提 | 当参数指定的 `type` 对应的事件被触发后激活 | +| 命名空间 | `ZM\Annotation\Swoole\OnSwooleEvent` | +| 适用位置 | 方法 | +| 返回值处理 | 无 | ### 注解参数 @@ -27,9 +140,70 @@ ### 事件绑定参数 -`$conn`: [ConnectionObject](/advanced/inside-class/) 类型,返回一个当前 WS 连接的连接对象。 +`$conn`: [ConnectionObject](/advanced/connect-ws-client/) 类型,返回一个当前 WS 连接的连接对象。 -### 示例1(机器人连接框架后输出信息) +## OnStart() + +在框架加载后执行的注解事件,用于初始化 Worker 进程,此注解事件会在 Worker 进程中执行,且可以指定在哪个 Worker 进程中执行。 + +### 属性 + +| 类型 | 值 | +| ---------- | ------------------------------ | +| 名称 | `@OnStart` | +| 触发前提 | 在框架加载后激活 | +| 命名空间 | `ZM\Annotation\Swoole\OnStart` | +| 适用位置 | 方法 | +| 返回值处理 | 无 | + +### 注解参数 + +| 参数名称 | 参数范围 | 用途 | 默认 | +| --------- | ------------------------------------------------------------ | ------------------------ | ---- | +| worker_id | `int`,要在哪个 Worker 进程上执行,默认为 0,范围是 0~{你设定的 Worker 数量-1},如果是 -1 的话,则会在所有 Worker 进程上触发。 | 限定只执行的 Worker 进程 | | + +## OnTick() + +在框架加载后创建毫秒计时器。 + +### 属性 + +| 类型 | 值 | +| ---------- | ----------------------------- | +| 名称 | `@OnTick` | +| 触发前提 | 在框架加载后激活 | +| 命名空间 | `ZM\Annotation\Swoole\OnTick` | +| 适用位置 | 方法 | +| 返回值处理 | 无 | + +### 注解参数 + +| 参数名称 | 参数范围 | 用途 | 默认 | +| --------- | ------------------------------------------------------------ | ------------------------ | ---- | +| tick_ms | `int`,**必填**,间隔的毫秒数,例如 1 秒间隔为 `1000`,范围大于 0,小于 86400000。 | | | +| worker_id | `int`,要在哪个 Worker 进程上执行,默认为 0,范围是 0~{你设定的 Worker 数量-1},如果是 -1 的话,则会在所有 Worker 进程上触发。 | 限定只执行的 Worker 进程 | | + +## OnSetup() + +在框架加载前执行的代码。此部分代码是在主进程执行的,不可在此事件中使用任何协程相关的功能。 + +比如我们要改变所有进程的 ini 设置,这时使用 `@OnStart(-1)` 这样只设置了 Worker 进程的内容,而主进程和管理进程无法被覆盖到。如果需要设置全局的一些配置,务必在此 `@OnSetup` 注解下执行。 + +### 属性 + +| 类型 | 值 | +| ---------- | ------------------------------ | +| 名称 | `@OnSetup` | +| 触发前提 | 在框架加载前激活 | +| 命名空间 | `ZM\Annotation\Swoole\OnSetup` | +| 适用位置 | 方法 | +| 返回值处理 | 无 | + +### 注解参数 + +无。 + +## 示例1(机器人连接框架后输出信息) ```php getRequest()->server['request_uri'] == '/favicon.ico'",level=200) + * @OnRequestEvent(rule="ctx()->getRequest()->server['request_uri'] == '/favicon.ico'",level=200) */ public function onRequest() { EventDispatcher::interrupt(); @@ -69,4 +243,107 @@ class Hello { } ``` -其中 EventDispatcher 为事件分发器,interrupt 是通用阻断方法,如果你平常只使用阻断,则只需掌握这一个方法即可,`EventDispatcher::interrupt()` 在所有事件内可用。 \ No newline at end of file +其中 EventDispatcher 为事件分发器,interrupt 是通用阻断方法,如果你平常只使用阻断,则只需掌握这一个方法即可,`EventDispatcher::interrupt()` 在所有事件内可用。 + +## 示例3(接收 WS 客户端发来的数据) + +见 [接入 WebSocket 客户端](/advanced/connect-ws-client/)。 + +## 示例4(使用 OnStart 给所有 Worker 进程写入缓存提速) + +如果你有一些数据存到了文件、数据库中,且是只读不写的,那么就可以使用此方法将这个文件或者数据库的内容读入 Worker 进程的内存中进行使用来提速。 + +假设我们有一个大文件 json,里面存着一份题库,例如: + +```json +{ + "0": { + "question": "法的调整对象是( )。", + "answer": { + "A": "行为关系", + "B": "思想关系", + "C": "利益关系", + "D": "各种社会资源" + }, + "key": "A", + "answer_type": 0 + }, + "1": { + "question": "法律与其他社会规范的区别在于( )。", + "answer": { + "A": "是调整人们行为的规范", + "B": "有约束力", + "C": "由国家强制力保证执行", + "D": "规定制裁措施" + }, + "key": "C", + "answer_type": 0 + }, + ..... +} +``` + +那么我们可以使用 OnStart 来实现一个,将此文件读取到每个 Worker 进程中,并且快速取用的功能(以下做了一个简单的查题功能): + +```php +getNumArg("请输入题目的序号"); + if(!isset(Hello::$tiku[$tiku_id])) return "题目id为".$tiku_id."的题目不存在!"; + $timu = Hello::$tiku[$tiku_id]; + $msg = "题目名称:".$timu["question"]; + foreach($timu["answer"] as $k => $v) { + $msg .= "\n".$k.". ".$v; + } + $msg .= "\n正确答案:".$timu["key"]; + return $msg; + } +} +``` + +终端效果:(我们假设运行框架的电脑是四核 CPU) + +```log +[14:28:00] [S] [#0] 加载题库完成! +[14:28:00] [S] [#2] 加载题库完成! +[14:28:00] [S] [#1] 加载题库完成! +[14:28:00] [S] [#3] 加载题库完成! +``` + +聊天效果: + + +) 找题 1 +( 题目名称:法律与其他社会规范的区别在于( )。\nA. 是调整人们行为的规范\nB. 有约束力\nC. 由国家强制力保证执行\nD. 规定制裁措施\n正确答案:C + + +## 示例5(创建每分钟自动执行的爬虫) + +```php +/** + * @OnTick(tick_ms=60000,worker_id=0) + */ +public function onCrawl() { + $data = Foo::bar(); //这里是你自己写的要爬的接口等等一系列操作 + LightCache::set("your_data_key_name", $data); //将爬虫数据存入 LightCache 轻量缓存 +} +``` + diff --git a/docs/javascripts/config.js b/docs/javascripts/config.js index 69f16a42..ef4a3254 100644 --- a/docs/javascripts/config.js +++ b/docs/javascripts/config.js @@ -75,13 +75,13 @@ setTimeout(() => { if(j === '') continue; if(j.substr(0, 2) === ') ') { final += '
\n' + - '
' + j.substr(2) + '
\n' + + '
' + j.substr(2).replaceAll("\\n", "
") + '
\n' + ' \n' + '
'; } else if (j.substr(0, 2) === '( ') { final += '
\n' + ' \n' + - '
' + j.substr(2) + '
\n' + + '
' + j.substr(2).replaceAll("\\n", "
") + '
\n' + '
'; } else if (j.substr(0, 2) === '^ ') { final += '
' + j.substr(2) + '
'; diff --git a/mkdocs.yml b/mkdocs.yml index 3a148eac..8cec69eb 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -89,8 +89,11 @@ nav: - Console 终端: component/console.md - 进阶开发: - 进阶开发: advanced/index.md + - 框架剖析: advanced/framework-structure.md + - 框架启动模式: advanced/custom-start.md - 从 v1 升级: advanced/to-v2.md - 内部类文件手册: advanced/inside-class.md + - 接入 WebSocket 客户端: advanced/connect-ws-client.md - FAQ: FAQ.md - 更新日志: - 更新日志(v2): update/v2.md diff --git a/src/Module/Example/Hello.php b/src/Module/Example/Hello.php index 8e886506..5ee91712 100644 --- a/src/Module/Example/Hello.php +++ b/src/Module/Example/Hello.php @@ -55,9 +55,9 @@ class Hello */ public function randNum() { // 获取第一个数字类型的参数 - $num1 = ctx()->getArgs(ZM_MATCH_NUMBER, "请输入第一个数字"); + $num1 = ctx()->getNumArg("请输入第一个数字"); // 获取第二个数字类型的参数 - $num2 = ctx()->getArgs(ZM_MATCH_NUMBER, "请输入第二个数字"); + $num2 = ctx()->getNumArg("请输入第二个数字"); $a = min(intval($num1), intval($num2)); $b = max(intval($num1), intval($num2)); // 回复用户结果 diff --git a/src/ZM/Command/InitCommand.php b/src/ZM/Command/InitCommand.php index 19090668..4e837f28 100644 --- a/src/ZM/Command/InitCommand.php +++ b/src/ZM/Command/InitCommand.php @@ -74,6 +74,7 @@ class InitCommand extends Command echo("Error occurred. Please check your updates.\n"); return Command::FAILURE; } + $output->writeln("Done!"); return Command::SUCCESS; } elseif (LOAD_MODE === 2) { //从phar启动的框架包,初始化的模式 $phar_link = new Phar(__DIR__); diff --git a/src/ZM/ConsoleApplication.php b/src/ZM/ConsoleApplication.php index 8e776c0a..748a76ae 100644 --- a/src/ZM/ConsoleApplication.php +++ b/src/ZM/ConsoleApplication.php @@ -75,6 +75,7 @@ class ConsoleApplication extends Application if (!($obj instanceof Command)) throw new TypeError("Command register class must be extended by Symfony\\Component\\Console\\Command\\Command"); $this->add($obj); }*/ + return $this; } /** diff --git a/src/ZM/Context/ContextInterface.php b/src/ZM/Context/ContextInterface.php index 00cbda60..249cf900 100644 --- a/src/ZM/Context/ContextInterface.php +++ b/src/ZM/Context/ContextInterface.php @@ -117,6 +117,8 @@ interface ContextInterface public function cloneFromParent(); + public function getNumArg($prompt_msg = ""); + public function copy(); public function getOption(); diff --git a/src/ZM/Event/EventManager.php b/src/ZM/Event/EventManager.php index a0404a29..beaac370 100644 --- a/src/ZM/Event/EventManager.php +++ b/src/ZM/Event/EventManager.php @@ -38,7 +38,7 @@ class EventManager public static function registerTimerTick() { $dispatcher = new EventDispatcher(OnTick::class); foreach (self::$events[OnTick::class] ?? [] as $vss) { - if (server()->worker_id !== $vss->worker_id) return; + if (server()->worker_id !== $vss->worker_id && $vss->worker_id != -1) return; //echo server()->worker_id.PHP_EOL; $plain_class = $vss->class; Console::debug("Added Middleware-based timer: " . $plain_class . " -> " . $vss->method); diff --git a/src/ZM/Event/ServerEventHandler.php b/src/ZM/Event/ServerEventHandler.php index 98324a3c..761b575b 100644 --- a/src/ZM/Event/ServerEventHandler.php +++ b/src/ZM/Event/ServerEventHandler.php @@ -386,7 +386,7 @@ class ServerEventHandler public function onOpen($server, Request $request) { Console::debug("Calling Swoole \"open\" event from fd=" . $request->fd); unset(Context::$context[Co::getCid()]); - $type = strtolower($request->get["type"] ?? $request->header["x-client-role"] ?? ""); + $type = strtolower($request->header["x-client-role"] ?? $request->get["type"] ?? ""); $type_conn = ManagerGM::getTypeClassName($type); ManagerGM::pushConnect($request->fd, $type_conn); $conn = ManagerGM::get($request->fd); diff --git a/src/ZM/Module/QQBot.php b/src/ZM/Module/QQBot.php index 2e450a5b..084ad444 100644 --- a/src/ZM/Module/QQBot.php +++ b/src/ZM/Module/QQBot.php @@ -78,6 +78,7 @@ class QQBot switch ($data["post_type"]) { case "message": $word = explodeMsg(str_replace("\r", "", context()->getMessage())); + if (empty($word)) $word = [""]; if (count(explode("\n", $word[0])) >= 2) { $enter = explode("\n", context()->getMessage()); $first = split_explode(" ", array_shift($enter));