mirror of
https://github.com/zhamao-robot/zhamao-framework.git
synced 2026-07-23 16:45:35 +08:00
1 line
54 KiB
JavaScript
1 line
54 KiB
JavaScript
(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{770:function(v,_,e){"use strict";e.r(_);var t=e(84),o=Object(t.a)({},(function(){var v=this,_=v._self._c;return _("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[_("h1",{attrs:{id:"更新日志-v2-版本"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#更新日志-v2-版本"}},[v._v("#")]),v._v(" 更新日志(v2 版本)")]),v._v(" "),_("h2",{attrs:{id:"v2-8-6-build-480"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-8-6-build-480"}},[v._v("#")]),v._v(" v2.8.6(build 480)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.1.26")])]),v._v(" "),_("ul",[_("li",[v._v("为task进程注册mysql和redis以便在task任务处理中使用相关组件 by @YiwanGi in https://github.com/zhamao-robot/zhamao-framework/pull/271")])]),v._v(" "),_("h2",{attrs:{id:"v2-8-5-build-479"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-8-5-build-479"}},[v._v("#")]),v._v(" v2.8.5(build 479)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.12.24")])]),v._v(" "),_("ul",[_("li",[v._v("解决explode_msg中,传入参数为0时,参数0消失的BUG by @FishZe in https://github.com/zhamao-robot/zhamao-framework/pull/143")]),v._v(" "),_("li",[v._v("fix route-annotations.md static file server demo by @sunxyw in https://github.com/zhamao-robot/zhamao-framework/pull/166")]),v._v(" "),_("li",[v._v("修复 getClassesPsr4 中默认过滤方法的路径 Bug by @crazywhalecc in https://github.com/zhamao-robot/zhamao-framework/pull/196")])]),v._v(" "),_("h2",{attrs:{id:"v2-8-4-build-478"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-8-4-build-478"}},[v._v("#")]),v._v(" v2.8.4(build 478)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.8.7")])]),v._v(" "),_("ul",[_("li",[v._v("修复 "),_("code",[v._v("zm_sleep()")]),v._v(" 无法传入小数的 Bug (#141)")])]),v._v(" "),_("h2",{attrs:{id:"v2-8-3-build-477"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-8-3-build-477"}},[v._v("#")]),v._v(" v2.8.3(build 477)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.8.5")])]),v._v(" "),_("ul",[_("li",[v._v("修复了 "),_("code",[v._v("@CQNotice")]),v._v("、"),_("code",[v._v("@CQRequest")]),v._v(" 注解无法正常激活的 Bug (#140)")])]),v._v(" "),_("h2",{attrs:{id:"v2-8-2-build-476"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-8-2-build-476"}},[v._v("#")]),v._v(" v2.8.2(build 476)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.8.3")])]),v._v(" "),_("ul",[_("li",[_("code",[v._v("DataProvider::scanDirFiles()")]),v._v(" 新增参数 "),_("code",[v._v("$include_dir")]),v._v(",用于控制非递归模式下是否包含目录")])]),v._v(" "),_("h2",{attrs:{id:"v2-8-1-build-475"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-8-1-build-475"}},[v._v("#")]),v._v(" v2.8.1(build 475)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.7.3")])]),v._v(" "),_("ul",[_("li",[v._v("修复 WebSocket 连接时报错的 Bug")]),v._v(" "),_("li",[v._v("修复 "),_("code",[v._v("match_args")]),v._v(" 全局方法对于 "),_("code",[v._v("0")]),v._v(" 字符串处理的 Bug(#136)")])]),v._v(" "),_("h2",{attrs:{id:"v2-8-0-build-473"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-8-0-build-473"}},[v._v("#")]),v._v(" v2.8.0(build 473)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.5.7")])]),v._v(" "),_("ul",[_("li",[v._v("新增 AllBotsProxy、AllGroupsProxy 代理类,支持批量发送机器人动作")]),v._v(" "),_("li",[v._v("新增全局函数 "),_("code",[v._v("implode_when_necessary()")]),v._v(",用于将可能为数组的参数转换为字符串")]),v._v(" "),_("li",[v._v("新增依赖注入、容器支持,目前对 Swoole 事件、机器人事件均支持使用依赖注入")]),v._v(" "),_("li",[v._v("新增全局容器方法 "),_("code",[v._v("container()")]),v._v("、"),_("code",[v._v("resolve()")]),v._v("、"),_("code",[v._v("app()")]),v._v(",用于获取容器参数等")]),v._v(" "),_("li",[v._v("新增相关容器测试")]),v._v(" "),_("li",[v._v("新增链式调用全局方法 "),_("code",[v._v("chain()")])]),v._v(" "),_("li",[v._v("新增函数执行时间工具全局函数 "),_("code",[v._v("stopwatch()")])]),v._v(" "),_("li",[v._v("新增 "),_("code",[v._v("@CommandArgument")]),v._v(" 注解,可直接通过注解添加聊天机器人命令参数")]),v._v(" "),_("li",[v._v("(内部)新增 "),_("code",[v._v("EventManager::$event_map")]),v._v(",用于补充对事件对象遍历的方式")]),v._v(" "),_("li",[v._v("新增 "),_("code",[v._v("EventMapIterator")]),v._v(" 类,用于遍历注解事件对象")]),v._v(" "),_("li",[v._v("新增 "),_("code",[v._v("MessageUtil::checkArguments()")]),v._v(" 方法,用于检查 "),_("code",[v._v("@CommandArgument")]),v._v(" 注解")]),v._v(" "),_("li",[v._v("新增启动命令参数 "),_("code",[v._v("--audit-mode")]),v._v(",用于单次审计模式")]),v._v(" "),_("li",[v._v("新增部分不可执行脚本的防呆退出功能")]),v._v(" "),_("li",[v._v("重构全局方法 "),_("code",[v._v("match_pattern()")]),v._v(",优化性能以及解决部分字符串不能匹配的 Bug")]),v._v(" "),_("li",[v._v("优化容器支持无名顺序参数的调用")]),v._v(" "),_("li",[v._v("优化静态路由,支持 64 以上长度的路由")]),v._v(" "),_("li",[v._v("优化 "),_("code",[v._v("@RequestMapping")]),v._v(" 注解事件的方法返回值处理,支持数组和字符串(数组自动转为 JSON 格式)")]),v._v(" "),_("li",[v._v("优化单元测试流程")]),v._v(" "),_("li",[v._v("优化上下文对象,在非协程环境下不再会抛出异常或返回 null")]),v._v(" "),_("li",[v._v("修改默认 Hello 模块下随机数功能为采用 "),_("code",[v._v("@CommandArgument")]),v._v(" 注解模式")]),v._v(" "),_("li",[v._v("重构帮助生成器,将帮助生成器重构为 "),_("code",[v._v("CommandInfoUtil")]),v._v(" 类")]),v._v(" "),_("li",[v._v("修复 "),_("code",[v._v("CQ::encode()")]),v._v(" 无法传入 "),_("code",[v._v("int")]),v._v(" 的强类型解析问题(#113)")]),v._v(" "),_("li",[v._v("(内部)重构 CQ 类")]),v._v(" "),_("li",[v._v("修复 "),_("code",[v._v("EventMapIterator")]),v._v(" 对 PHP 8.1 的兼容性问题")]),v._v(" "),_("li",[v._v("修复 #95 中提到的无输入流时报错的问题")]),v._v(" "),_("li",[v._v("修复 "),_("code",[v._v("ZMServer")]),v._v(" 中的 typo")]),v._v(" "),_("li",[v._v("修复 Container 环境继承全局变量的问题")]),v._v(" "),_("li",[v._v("修复 "),_("code",[v._v("server:stop")]),v._v(" 命令下部分情况报错的问题")])]),v._v(" "),_("h2",{attrs:{id:"v2-7-6-build-460"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-7-6-build-460"}},[v._v("#")]),v._v(" v2.7.6(build 460)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.4.3")])]),v._v(" "),_("ul",[_("li",[v._v("重构 phpunit-swoole,使其可以正常使用")]),v._v(" "),_("li",[v._v("新增 "),_("code",[v._v("--private-mode")]),v._v(" 参数,用于隐藏启动前的 MOTD 及敏感信息")]),v._v(" "),_("li",[v._v("修复 Composer extra 配置项 "),_("code",[v._v("zm.exclude-annotation-path")]),v._v(" 不能正常工作的 Bug")]),v._v(" "),_("li",[v._v("优化注解事件加载器,防止 Master 进程中添加的事件在 Worker 中被覆盖的问题")]),v._v(" "),_("li",[v._v("修复 "),_("code",[v._v("DataProvider::isRelativePath()")]),v._v(" 方法判断有误的 Bug")]),v._v(" "),_("li",[v._v("新增退出框架时支持以非 0 exit code 退出的功能")]),v._v(" "),_("li",[v._v("优化 "),_("code",[v._v("ZMUtil::getClassesPsr4()")]),v._v(" 方法,排除不含类的文件")]),v._v(" "),_("li",[v._v("优化 "),_("code",[v._v("module:xxx")]),v._v(" 类命令的有关实现代码")]),v._v(" "),_("li",[v._v("优化代码到 phpstan-level-4")])]),v._v(" "),_("h2",{attrs:{id:"v2-7-5-build-455"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-7-5-build-455"}},[v._v("#")]),v._v(" v2.7.5(build 455)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.3.27")])]),v._v(" "),_("ul",[_("li",[v._v("修复前几个小版本无法收发消息的 Bug")]),v._v(" "),_("li",[v._v("新增 API Document 自动生成脚本")])]),v._v(" "),_("h2",{attrs:{id:"v2-7-4-build-454"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-7-4-build-454"}},[v._v("#")]),v._v(" v2.7.4(build 454)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.3.27")])]),v._v(" "),_("ul",[_("li",[v._v("修复部分命令下无法杀掉进程的 Bug")]),v._v(" "),_("li",[v._v("新增 "),_("code",[v._v("@Cron")]),v._v(" 注解")]),v._v(" "),_("li",[v._v("修复全局函数 "),_("code",[v._v("match_pattern")]),v._v(" 无法正常工作的 Bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-7-3-build-453"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-7-3-build-453"}},[v._v("#")]),v._v(" v2.7.3(build 453)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.3.25")])]),v._v(" "),_("ul",[_("li",[v._v("新增命令帮助生成器")]),v._v(" "),_("li",[v._v("重构全局函数,统一函数命名,并补全注释")]),v._v(" "),_("li",[v._v("修复 OnSetup 注解无法使用 Attribute 解析的 Bug")]),v._v(" "),_("li",[v._v("修复 HelpGenerator 的 Alias 不工作的 Bug")]),v._v(" "),_("li",[v._v("新增 property 注解用于 IDE 识别")])]),v._v(" "),_("h2",{attrs:{id:"v2-7-2-build-449"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-7-2-build-449"}},[v._v("#")]),v._v(" v2.7.2(build 449)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.3.21")])]),v._v(" "),_("ul",[_("li",[v._v("新增 Composer 模块加载和分发模式")])]),v._v(" "),_("h2",{attrs:{id:"v2-7-1-build-448"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-7-1-build-448"}},[v._v("#")]),v._v(" v2.7.1(build 448)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.3.20")])]),v._v(" "),_("ul",[_("li",[v._v("加快 build 命令的执行速度,取消进度条和提升性能")])]),v._v(" "),_("h2",{attrs:{id:"v2-7-0-build-447"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-7-0-build-447"}},[v._v("#")]),v._v(" v2.7.0(build 447)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.3.20")])]),v._v(" "),_("ul",[_("li",[v._v("优化分离 WorkerManager 与 ProcessManager 的职责")]),v._v(" "),_("li",[v._v("新增 Ctrl+C 一次无法停止框架时多次 Ctrl+C 后可强行杀掉所有进程的功能")]),v._v(" "),_("li",[_("code",[v._v("./zhamao server:stop")]),v._v(" 新增参数 "),_("code",[v._v("--force")]),v._v(",使用 "),_("code",[v._v("SIGKILL")]),v._v(" 强行杀掉所有进程")]),v._v(" "),_("li",[v._v("新增 AnnotationParser 对 "),_("code",[v._v("autoload-dev")]),v._v(" 项中的 "),_("code",[v._v("psr-4")]),v._v(" 默认检索条件")]),v._v(" "),_("li",[v._v("新增框架启动状态检测功能,如果已经启动了同样目录的框架,则会报错")]),v._v(" "),_("li",[v._v("新增“强制启用轮询模式启动热更新”功能(参数 "),_("code",[v._v("--polling-watch")]),v._v(")")]),v._v(" "),_("li",[v._v("修复与 PHP 8.1 的兼容性")]),v._v(" "),_("li",[v._v("对 DaemonCommand 进行优化,与 ServerCommand 效果相同")]),v._v(" "),_("li",[v._v("修复 "),_("code",[v._v("autoload")]),v._v("."),_("code",[v._v("psr-4")]),v._v(" 不存在时报错的 Bug")]),v._v(" "),_("li",[v._v("新增框架停止时 Worker 退出回显状态码")]),v._v(" "),_("li",[v._v("新增 inotify 判断模式,如果使用 "),_("code",[v._v("--watch")]),v._v(" 检测到没有安装 inotify,则自动使用轮询模式")]),v._v(" "),_("li",[v._v("新增 PHPStan 和 PHP CS Fixer 并优化全局代码")]),v._v(" "),_("li",[v._v("修复 "),_("code",[v._v("ctx()")]),v._v(" 可能会返回 null 的 Bug")]),v._v(" "),_("li",[v._v("修复 Response 类在 PHP 8.1 环境下的报错")]),v._v(" "),_("li",[v._v("新增 PHP 8 Attribute 与注解同时支持的特性")]),v._v(" "),_("li",[v._v("新增方法宏(Macroable)")]),v._v(" "),_("li",[v._v("修复打包模块时命名空间与实际不一致的 Bug")]),v._v(" "),_("li",[v._v("修复打包模块后 "),_("code",[v._v("files")]),v._v(" 的 autoload 项不能被解压和引入的 Bug")]),v._v(" "),_("li",[v._v("修复注释空格的样式")]),v._v(" "),_("li",[v._v("更改 "),_("code",[v._v("extra")]),v._v("."),_("code",[v._v("exclude_annotate")]),v._v(" 为 "),_("code",[v._v("zm")]),v._v("."),_("code",[v._v("exclude-annotation-path")]),v._v(" 项")]),v._v(" "),_("li",[v._v("新增配置项 "),_("code",[v._v("runtime")]),v._v("."),_("code",[v._v("annotation_reader_ignore")]),v._v(":支持注解解析器忽略注解的自定义")]),v._v(" "),_("li",[v._v("新增 "),_("code",[v._v("./zhamao server")]),v._v(" 下的 "),_("code",[v._v("--no-state-check")]),v._v(" 参数,关闭“启动框架前的运行状态检查”功能")])]),v._v(" "),_("h2",{attrs:{id:"v2-6-6-build-434"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-6-6-build-434"}},[v._v("#")]),v._v(" v2.6.6(build 434)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2022.1.8")])]),v._v(" "),_("ul",[_("li",[v._v("修复框架在 PHP 8.1 下运行时的一些问题")]),v._v(" "),_("li",[v._v("新增 Console 日志输出到文件的功能")])]),v._v(" "),_("h2",{attrs:{id:"v2-6-5-build-433"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-6-5-build-433"}},[v._v("#")]),v._v(" v2.6.5(build 433)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.12.28")])]),v._v(" "),_("ul",[_("li",[v._v("修复 OneBotV11 因 IDE 自动优化导致 API 接口发生变化的问题")])]),v._v(" "),_("h2",{attrs:{id:"v2-6-4-build-432"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-6-4-build-432"}},[v._v("#")]),v._v(" v2.6.4(build 432)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.12.25")])]),v._v(" "),_("ul",[_("li",[v._v("新增 GoCqhttpAPI 包,用于支持额外的 OneBot Action(API)")]),v._v(" "),_("li",[v._v("修复 MySQL 查询器中 "),_("code",[v._v("fetchOne()")]),v._v(" 方法无法正确返回值的 Bug")]),v._v(" "),_("li",[v._v("修复 Swoole Hook 因配置不当无法正确使用的 Bug")]),v._v(" "),_("li",[v._v("修复 Issue #50")]),v._v(" "),_("li",[v._v("新增 PhpStorm IDE 直接运行框架的脚本")])]),v._v(" "),_("h2",{attrs:{id:"v2-6-3-build-430"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-6-3-build-430"}},[v._v("#")]),v._v(" v2.6.3 (build 430)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.12.8")])]),v._v(" "),_("ul",[_("li",[v._v("删除调试信息")]),v._v(" "),_("li",[v._v("修复 #56 中关于数据库组件的 Bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-6-2-build-429"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-6-2-build-429"}},[v._v("#")]),v._v(" v2.6.2 (build 429)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.12.7")])]),v._v(" "),_("ul",[_("li",[v._v("新增配置项 "),_("code",[v._v("onebot")]),v._v("."),_("code",[v._v("message_command_policy")])]),v._v(" "),_("li",[v._v("新增 CQCommand 阻断策略的自定义配置功能")]),v._v(" "),_("li",[v._v("修复 CQAfter 无法正常使用的 bug #53")])]),v._v(" "),_("h2",{attrs:{id:"v2-6-1-build-428"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-6-1-build-428"}},[v._v("#")]),v._v(" v2.6.1 (build 428)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.11.16")])]),v._v(" "),_("ul",[_("li",[v._v("修复 ctx()->waitMessage() 在 array 消息模式下无法正确返回消息字符串的问题")]),v._v(" "),_("li",[v._v("新增 ctx()->getArrayMessage() 和 ctx()->getStringMessage() 两个方法")]),v._v(" "),_("li",[v._v("修复注解事件 CQCommand 和 CQMessage 在 array 消息模式下无法正确解析的 Bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-6-0-build-427"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-6-0-build-427"}},[v._v("#")]),v._v(" v2.6.0 (build 427)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.11.16")])]),v._v(" "),_("ul",[_("li",[v._v("新增全局中间件,可在全局配置文件中设置")]),v._v(" "),_("li",[v._v("修复部分 Typo")]),v._v(" "),_("li",[v._v("新增指令 "),_("code",[v._v("server:status")]),v._v("、"),_("code",[v._v("server:reload")]),v._v("、"),_("code",[v._v("server:stop")]),v._v(" 可用在新开终端中查看框架运行状态、重启和退出")]),v._v(" "),_("li",[v._v("新增支持 "),_("code",[v._v("array")]),v._v(" 格式的消息")]),v._v(" "),_("li",[v._v("上下文 Context 对象新增 "),_("code",[v._v("getOriginMessage()")]),v._v(" 用于获取原消息,"),_("code",[v._v("getMessage()")]),v._v(" 如果在设置了转换后,将默认转换消息为字符串格式保持与旧模块兼容")]),v._v(" "),_("li",[v._v("OneBot API 新增全局过滤器,可用作 Action 过滤重写等操作")]),v._v(" "),_("li",[v._v("配置文件新增 "),_("code",[v._v("runtime.reload_delay_time")]),v._v(",用于可配置重载 Worker 等待的时间(毫秒)")]),v._v(" "),_("li",[v._v("配置文件新增 "),_("code",[v._v("runtime.global_middleware_binding")]),v._v(",用于配置全局中间件")]),v._v(" "),_("li",[v._v("配置文件新增 "),_("code",[v._v("onebot.message_convert_string")]),v._v(",用于配置是否转换数组格式为字符串,保证与前版本的兼容性(默认为 true)")]),v._v(" "),_("li",[v._v("MessageUtil 消息工具类新增方法:"),_("code",[v._v("strToArray($msg, bool $ignore_space = true, bool $trim_text = false)")])]),v._v(" "),_("li",[v._v("MessageUtil 消息工具类新增方法:"),_("code",[v._v("arrayToStr(array $array)")])]),v._v(" "),_("li",[v._v("新增框架启动多次监测功能,无法使用同一个框架项目同时启动两个框架")])]),v._v(" "),_("h2",{attrs:{id:"v2-5-8-build-426"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-5-8-build-426"}},[v._v("#")]),v._v(" v2.5.8 (build 426)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.11.10")])]),v._v(" "),_("ul",[_("li",[v._v("修复 CQ 码的解析函数 Bug(#52)")])]),v._v(" "),_("h2",{attrs:{id:"v2-5-7-build-425"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-5-7-build-425"}},[v._v("#")]),v._v(" v2.5.7 (build 425)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.11.3")])]),v._v(" "),_("ul",[_("li",[v._v("调低 OneBot 相关事件在 Swoole 的优先级")]),v._v(" "),_("li",[v._v("修复部分情况下闭包事件函数分发时引发的崩溃 bug")]),v._v(" "),_("li",[v._v("修复 reload 时会断开 WebSocket 连接且导致进程崩溃的 bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-5-6-build-423"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-5-6-build-423"}},[v._v("#")]),v._v(" v2.5.6 (build 423)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.10.17")])]),v._v(" "),_("ul",[_("li",[v._v("修复 PHP 7.2 ~ 7.3 下无法使用新版 MySQL 组件的 bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-5-5-build-422"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-5-5-build-422"}},[v._v("#")]),v._v(" v2.5.5 (build 422)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.10.6")])]),v._v(" "),_("ul",[_("li",[v._v("修复 "),_("code",[v._v("script_")]),v._v(" 前缀无法被排除加载模块的 bug")]),v._v(" "),_("li",[v._v("修复 MySQL 组件的依赖问题")])]),v._v(" "),_("h2",{attrs:{id:"v2-5-4-buidl-421"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-5-4-buidl-421"}},[v._v("#")]),v._v(" v2.5.4 (buidl 421)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.9.11")])]),v._v(" "),_("ul",[_("li",[v._v("删除多余的调试信息")])]),v._v(" "),_("h2",{attrs:{id:"v2-5-3-build-420"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-5-3-build-420"}},[v._v("#")]),v._v(" v2.5.3 (build 420)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.9.11")])]),v._v(" "),_("ul",[_("li",[v._v("修复 DB 模块在未连接数据库的时候抛出未知异常")]),v._v(" "),_("li",[v._v("修复部分情况下打包模块出现的错误")]),v._v(" "),_("li",[v._v("修复 OneBot 事件无法响应的 bug")]),v._v(" "),_("li",[v._v("新增部分 EventDispatcher 触发的事件 debug 日志")])]),v._v(" "),_("h2",{attrs:{id:"v2-5-2-build-418"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-5-2-build-418"}},[v._v("#")]),v._v(" v2.5.2 (build 418)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.9.10")])]),v._v(" "),_("ul",[_("li",[v._v("新增 AnnotationException,统一框架内部的抛出异常的类型")]),v._v(" "),_("li",[v._v("新增 AnnotationParser 下的 "),_("code",[v._v("verifyMiddlewares()")]),v._v(" 方法")]),v._v(" "),_("li",[v._v("私有化 CQAPI 类下的内部方法")]),v._v(" "),_("li",[v._v("将 WebSocket API 响应超时时间从 60 秒缩短为 30 秒")]),v._v(" "),_("li",[v._v("修复 DB 类不能使用旧查询器的 bug")]),v._v(" "),_("li",[v._v("统一 DB 类下抛出 Exception 的类型为 ZMException 的子类")]),v._v(" "),_("li",[v._v("EventDispatcher 新增对 "),_("code",[v._v("middleware_error_policy")]),v._v(" 的处理段")]),v._v(" "),_("li",[v._v("配置文件下 "),_("code",[v._v("runtime")]),v._v(" 新增 "),_("code",[v._v("middleware_error_policy")]),v._v(" 字段")]),v._v(" "),_("li",[v._v("将 LightCache 组件抛出的异常改为 LightCacheException")]),v._v(" "),_("li",[v._v("ModuleManager 修复改配置的 "),_("code",[v._v("load_path")]),v._v(" 不生效的 bug")]),v._v(" "),_("li",[v._v("修复打包时生成的 Phar Autoload 列表出错的 bug")]),v._v(" "),_("li",[v._v("将配置的 override 改为 overwrite")]),v._v(" "),_("li",[v._v("新增解包时忽略依赖的选项("),_("code",[v._v("--ignore-depends")]),v._v(")")]),v._v(" "),_("li",[v._v("删除众多调试日志,修改部分调试日志为 debug 级别的输出")]),v._v(" "),_("li",[v._v("修改 "),_("code",[v._v("ZM\\MySQL\\MySQLManager")]),v._v(" 下的 "),_("code",[v._v("getConnection()")]),v._v(" 为 "),_("code",[v._v("getWrapper()")])]),v._v(" "),_("li",[v._v("MySQLPool 对象新增 "),_("code",[v._v("getCount()")]),v._v(" 方法")]),v._v(" "),_("li",[v._v("新增 MySQLQueryBuilder 类("),_("code",[v._v("doctrine/dbal")]),v._v(" 的 wrapper 类)")]),v._v(" "),_("li",[v._v("修复 MySQLStatement 封装原 dbal 组件时与连接池不兼容的 bug")]),v._v(" "),_("li",[v._v("新增 MySQLStatementWrapper 类")]),v._v(" "),_("li",[v._v("完善 MySQLWrapper 类,用作主要的查询对象控制类")]),v._v(" "),_("li",[v._v("编写外部插件加载方式(Phar 热加载功能)")]),v._v(" "),_("li",[v._v("修复 "),_("code",[v._v("ZMUtil::getClassesPsr4()")]),v._v(" 方法在遇到空扩展名文件时的报错")])]),v._v(" "),_("h2",{attrs:{id:"v2-5-1-build-416"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-5-1-build-416"}},[v._v("#")]),v._v(" v2.5.1 (build 416)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.7.9")])]),v._v(" "),_("ul",[_("li",[v._v("修复:脚手架无法正常使用 "),_("code",[v._v("init")]),v._v(" 命令的 bug。")])]),v._v(" "),_("h2",{attrs:{id:"v2-5-0-build-415"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-5-0-build-415"}},[v._v("#")]),v._v(" v2.5.0(build 415)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.7.9")])]),v._v(" "),_("p",[v._v("以下是版本"),_("strong",[v._v("新增内容")]),v._v(":")]),v._v(" "),_("ul",[_("li",[v._v("新增全新的模块系统,可打包模块(src 目录下的子目录用户逻辑代码)为 phar 格式进行分发和版本备份。")]),v._v(" "),_("li",[v._v("全局配置文件新增 "),_("code",[v._v("module_loader")]),v._v(" 项,用于配置外部模块加载的一些设置。")]),v._v(" "),_("li",[v._v("全局配置文件新增 "),_("code",[v._v("runtime")]),v._v(" 配置项,可自定义配置 Swoole 的一些运行时参数,目前可配置一键协程化的 Hook 参数和 Swoole Server 的启动模式。")]),v._v(" "),_("li",[v._v("新增 "),_("code",[v._v("module:list")]),v._v(" 命令,用于查看未打包和已打包的模块列表。")]),v._v(" "),_("li",[v._v("新增 "),_("code",[v._v("module:pack")]),v._v(" 命令,用于打包现有 src 目录下的模块。")]),v._v(" "),_("li",[v._v("新增 "),_("code",[v._v("module:unpack")]),v._v(" 命令,用于解包现有的 phar 模块包。")]),v._v(" "),_("li",[v._v("新增打包框架功能,支持将用户的整个项目连同炸毛框架打包为一个 phar 便携运行,使用命令 "),_("code",[v._v("build")]),v._v("。")]),v._v(" "),_("li",[v._v("新增快捷脚本 "),_("code",[v._v("./zhamao")]),v._v(",效果同 "),_("code",[v._v("vendor/bin/start")]),v._v(" 或 "),_("code",[v._v("bin/start")]),v._v("。")]),v._v(" "),_("li",[v._v("新增启动参数 "),_("code",[v._v("--interact")]),v._v(":又重新支持交互终端了,但还是有点问题,不推荐使用。")]),v._v(" "),_("li",[v._v("新增启动参数 "),_("code",[v._v("--disable-safe-exit")]),v._v(":如果你的项目在 Ctrl+C 时总是卡住且项目内没有什么使用 LightCache 等缓存在内存的数据可开启防止关不掉框架。")]),v._v(" "),_("li",[v._v("新增启动参数 "),_("code",[v._v("--preview")]),v._v(":只显示参数,不启动炸毛框架的服务器。")]),v._v(" "),_("li",[v._v("新增启动参数 "),_("code",[v._v("--force-load-module")]),v._v(":强制打包状态下加载的模块(使用英文逗号分隔多个模块名称)。")]),v._v(" "),_("li",[_("code",[v._v("CoroutinePool")]),v._v(" 协程池新增 "),_("code",[v._v("getRunningCoroutineCount")]),v._v(" 方法,用于查看协程池中的协程数量。")]),v._v(" "),_("li",[_("code",[v._v("DataProvider")]),v._v(" 新增 "),_("code",[v._v("getFrameworkRootDir()")]),v._v("、"),_("code",[v._v("getSourceRootDir()")]),v._v(",分别代表获取框架的根目录和用户源码根目录。(详见下方对目录的定义解释)")]),v._v(" "),_("li",[_("code",[v._v("DataProvider")]),v._v(" 中 "),_("code",[v._v("getDataFolder")]),v._v(" 新增参数 "),_("code",[v._v("$second = ''")]),v._v(",如果给定,则自动创建子目录 "),_("code",[v._v("$second")]),v._v(" 并返回。")]),v._v(" "),_("li",[_("code",[v._v("DataProvider")]),v._v(" 新增 "),_("code",[v._v("scanDirFiles()")]),v._v(" 方法,用于扫描目录,可选择是否递归、是否返回相对路径,也支持扫描 Phar 文件内的路径,非常好用。")]),v._v(" "),_("li",[_("code",[v._v("DataProvider")]),v._v(" 新增 "),_("code",[v._v("isRelativePath()")]),v._v(" 方法,检查路径是否为相对路径(根据第一个字符是否是 '/' 来判断)。")]),v._v(" "),_("li",[_("code",[v._v("ZMUtil")]),v._v(" 新增 "),_("code",[v._v("getClassesPsr4()")]),v._v(" 方法,用于根据 Psr-4 标准来获取目录下的所有类文件。")]),v._v(" "),_("li",[v._v("新增全局错误码,可以根据错误码在文档内快速定位和解决问题。")]),v._v(" "),_("li",[v._v("中间件和注解事件支持回溯,可以快速查看调用栈(比如中间件可以知道自己是在哪个注解事件中被调用)。")]),v._v(" "),_("li",[v._v("使用 "),_("code",[v._v("./zhamao build")]),v._v(" 来构建框架的 phar 包时增加显示进度条。")]),v._v(" "),_("li",[v._v("EventDispatcher 新增方法 "),_("code",[v._v("getEid()")]),v._v(" 和 "),_("code",[v._v("getClass()")]),v._v(",分别用于获取事件分发 ID 和注解事件的注解类名称。")]),v._v(" "),_("li",[v._v("新增 EventTracer,用于追踪事件的调用栈。")]),v._v(" "),_("li",[v._v("中间件支持传参。")]),v._v(" "),_("li",[v._v("MySQL 数据库查询器改为使用 "),_("code",[v._v("doctrine/dbal")]),v._v(" 组件,更灵活和稳定。")]),v._v(" "),_("li",[v._v("新增对 "),_("code",[v._v("SWOOLE_BASE")]),v._v(" 模式的支持(支持只启动一个进程的 Server)。")])]),v._v(" "),_("p",[v._v("以下是版本"),_("strong",[v._v("修改内容")]),v._v(":")]),v._v(" "),_("ul",[_("li",[v._v("启动文件 "),_("code",[v._v("vendor/bin/start")]),v._v(" 修改为 shell 脚本,可自动寻找 PHP 环境。")]),v._v(" "),_("li",[v._v("全局强制依赖 "),_("code",[v._v("league/climate")]),v._v(" 组件。")]),v._v(" "),_("li",[v._v("修复框架启动时的信息显示换行问题。")]),v._v(" "),_("li",[v._v("修复框架使用 Phar 方式启动时导致的报错。")]),v._v(" "),_("li",[v._v("修复使用 Ctrl+C 结束时一部分用户卡住的 bug。")]),v._v(" "),_("li",[v._v("远程和本地终端去掉 stop 命令,建议直接使用发 SIGTERM 方式结束框架。")]),v._v(" "),_("li",[v._v("全局配置文件的 "),_("code",[v._v("zm_data")]),v._v(" 根目录默认修改为 "),_("code",[v._v("WORKING_DIR")]),v._v("。")]),v._v(" "),_("li",[v._v("命令 "),_("code",[v._v("systemd:generate")]),v._v(" 修改为 "),_("code",[v._v("generate:systemd")]),v._v("。")]),v._v(" "),_("li",[v._v("全局配置文件删除 "),_("code",[v._v("server_event_handler_class")]),v._v(" 项,此项废弃。")]),v._v(" "),_("li",[v._v("修复部分 CQ 码解析过程中没有转义的问题。")]),v._v(" "),_("li",[v._v("将 "),_("code",[v._v("ZMRobot")]),v._v(" 类转移为 "),_("code",[v._v("OneBotV11")]),v._v(" 类,但提供兼容。")]),v._v(" "),_("li",[v._v("修复在守护进程模式下使用 "),_("code",[v._v("daemon:reload")]),v._v(" 和 "),_("code",[v._v("daemon:stop")]),v._v(" 命令可能失效的问题。")]),v._v(" "),_("li",[v._v("修复 systemd 生成时脚本目录错误的 bug。")]),v._v(" "),_("li",[v._v("修复 PipeMessage 等事件未捕获错误导致崩溃的问题。")]),v._v(" "),_("li",[_("code",[v._v("ZM\\Http\\RouteManager")]),v._v(" 移动到 "),_("code",[v._v("ZM\\Utils\\Manager\\RouteManager")]),v._v(",但原地址兼容。")]),v._v(" "),_("li",[v._v("修复 "),_("code",[v._v("Terminal")]),v._v(" 类使用的一些问题。")]),v._v(" "),_("li",[v._v("对 "),_("code",[v._v("pcntl")]),v._v(" 扩展改为可选依赖,当 Swoole 版本大于等于 4.6.7 时不需要安装 "),_("code",[v._v("pcntl")]),v._v(" 扩展。")]),v._v(" "),_("li",[v._v("修正启动时框架对缺省配置项的一些默认参数。")]),v._v(" "),_("li",[v._v("注解 "),_("code",[v._v("@OnSetup")]),v._v(" 和 "),_("code",[v._v("@SwooleHandler")]),v._v(" 可直接使用,无需设置 "),_("code",[v._v("server_event_handler_class")]),v._v(" 即可。")]),v._v(" "),_("li",[v._v("修复框架在一些非正常终端中运行时导致错误的问题。")]),v._v(" "),_("li",[v._v("使用 "),_("code",[v._v("--debug-mode")]),v._v(" 参数时,自动开启热更新。")]),v._v(" "),_("li",[v._v("修复脚手架在使用 composer 更新后检查全局配置功能的 bug。")]),v._v(" "),_("li",[v._v("修复重启和关闭框架时造成的非正常连接断开。")]),v._v(" "),_("li",[v._v("改用独立进程监听文件变化和终端输入。")]),v._v(" "),_("li",[v._v("修复有协程中断的任务时停止服务器会报 Swoole 警告的 bug。")]),v._v(" "),_("li",[v._v("修复连接被反复断开的问题。")])]),v._v(" "),_("p",[_("strong",[v._v("对目录的定义解释")]),v._v(":")]),v._v(" "),_("p",[v._v("在 2.4.4 版本之前,使用炸毛框架中,只含有两种目录,"),_("code",[v._v("getWorkingDir")]),v._v(" 和 "),_("code",[v._v("getDataFolder")]),v._v(",分别代表获取工作目录和数据目录。在 2.5 版本中,又新增了 "),_("code",[v._v("getFrameworkRootDir")]),v._v(" 代表获取框架的根目录,"),_("code",[v._v("getSourceRootDir")]),v._v(" 代表获取源码的根目录。")]),v._v(" "),_("p",[v._v("以 Composer 运行模式举例,如果你使用 "),_("code",[v._v("composer create-project zhamao/framework-starter")]),v._v(" 命令新建的框架,那么假设我们从 "),_("code",[v._v("/app")]),v._v(" 目录下运行此命令,然后使用 "),_("code",[v._v("cd framework-starter/")]),v._v(" 进入项目目录,此时我们使用 "),_("code",[v._v("vendor/bin/start server")]),v._v(" 命令运行服务器,对应的目录为:")]),v._v(" "),_("ul",[_("li",[_("code",[v._v("WorkingDir")]),v._v(":"),_("code",[v._v("/app/framework-starter/")])]),v._v(" "),_("li",[_("code",[v._v("SourceRootDir")]),v._v(":"),_("code",[v._v("/app/framework-starter/")])]),v._v(" "),_("li",[_("code",[v._v("FrameworkRootDir")]),v._v(":"),_("code",[v._v("/app/framework-starter/vendor/zhamao/framework/")])])]),v._v(" "),_("p",[v._v("如果以源码模式(直接克隆 "),_("code",[v._v("zhamao-framework.git")]),v._v(" 仓库),启动框架,那么使用命令 "),_("code",[v._v("bin/start server")]),v._v(" 启动框架后,以上三个返回的目录则完全相同。")]),v._v(" "),_("p",[v._v("如果以 2.5 版本新的项目归档模式(build)启动框架,假设我们的项目代码打包为 "),_("code",[v._v("server.phar")]),v._v(",在 "),_("code",[v._v("/app/")]),v._v(" 目录,我们使用命令 "),_("code",[v._v("php server.phar server")]),v._v(" 启动炸毛框架,那么它对应的目录为:")]),v._v(" "),_("ul",[_("li",[_("code",[v._v("WorkingDir")]),v._v(":"),_("code",[v._v("/app/")])]),v._v(" "),_("li",[_("code",[v._v("SourceRootDir")]),v._v(":"),_("code",[v._v("phar:///app/server.phar/")])]),v._v(" "),_("li",[_("code",[v._v("FrameworkRootDir")]),v._v(":"),_("code",[v._v("phar:///app/server.phar/vendor/zhamao/framework/")])])]),v._v(" "),_("p",[v._v("如果最后一种归档方式启动的框架是从源码模式打包而来,那么 "),_("code",[v._v("FrameworkRootDir")]),v._v(" 就与 "),_("code",[v._v("SourceRootDir")]),v._v(" 相同。")]),v._v(" "),_("p",[_("strong",[v._v("版本部分兼容问题变化")]),v._v(":")]),v._v(" "),_("p",[v._v("理论上如果不使用框架内部未开放的接口方法的话,从 2.4 升级到 2.5 是非常自然的,但是也有一部分可能会造成不兼容的问题。")]),v._v(" "),_("ul",[_("li",[v._v("生成 systemd 配置文件的命令 "),_("code",[v._v("systemd:generate")]),v._v(" 变成 "),_("code",[v._v("generate:systemd")]),v._v("。")]),v._v(" "),_("li",[v._v("全局配置文件中的 "),_("code",[v._v("zm_data")]),v._v(" 的父目录由 "),_("code",[v._v('__DIR__ . "/../"')]),v._v(" 改为 "),_("code",[v._v("WORKING_DIR")]),v._v("。")]),v._v(" "),_("li",[v._v("2.5 版本将 ZMRobot 类中的所有函数方法都移动到了 "),_("code",[v._v("OneBotV11")]),v._v(" 类中,但原先的 ZMRobot 还可以使用。")])]),v._v(" "),_("h2",{attrs:{id:"v2-4-4-build-405"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-4-build-405"}},[v._v("#")]),v._v(" v2.4.4 (build 405)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.3.29")])]),v._v(" "),_("p",[v._v("以下是可能不兼容的变更:")]),v._v(" "),_("ul",[_("li",[v._v("新增依赖:框架需要 PHP 安装 pcntl 扩展以及开启 "),_("code",[v._v("pcntl_signal")]),v._v(" 函数(一般情况下编译安装的都会有,宝塔面板请手动解除函数禁用)")])]),v._v(" "),_("h2",{attrs:{id:"v2-4-3-build-403"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-3-build-403"}},[v._v("#")]),v._v(" v2.4.3 (build 403)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.3.29")])]),v._v(" "),_("ul",[_("li",[v._v("新增:swoole 设置配置新增 "),_("code",[v._v("max_wait_time")]),v._v(" 项,设置等待进程关闭流程最大时间(秒)")]),v._v(" "),_("li",[v._v("新增:常量 "),_("code",[v._v("MAIN_WORKER")]),v._v(",值等同于 "),_("code",[v._v("worker_cache")]),v._v(" 项中的 "),_("code",[v._v("worker")]),v._v(" 参数(WorkerCache 所在的进程)")]),v._v(" "),_("li",[v._v("新增:"),_("code",[v._v("LightCache")]),v._v(" 新增 "),_("code",[v._v("getExpireTS()")]),v._v(" 方法,用于返回项目过期的时间戳")]),v._v(" "),_("li",[v._v("修复:"),_("code",[v._v("savePersistence()")]),v._v(" 的部分丢失数据的 bug")]),v._v(" "),_("li",[v._v("新增:全局方法 "),_("code",[v._v("zm_go()")])]),v._v(" "),_("li",[v._v("修复:2.4.2 版本下的刷屏报错")]),v._v(" "),_("li",[v._v("优化:Ctrl+C 响应机制,启用异步 重启/关闭 措施,防止残留僵尸进程和丢失数据")])]),v._v(" "),_("h2",{attrs:{id:"v2-4-2-build-402"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-2-build-402"}},[v._v("#")]),v._v(" v2.4.2 (build 402)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.3.27")])]),v._v(" "),_("ul",[_("li",[v._v("更改:"),_("code",[v._v("WORKING_DIR")]),v._v(" 常量的含义")]),v._v(" "),_("li",[v._v("修复:未指定 "),_("code",[v._v("--remote-terminal")]),v._v(" 参数时还依旧开启远程终端的 bug")]),v._v(" "),_("li",[v._v("删除:"),_("code",[v._v("phar_classloader()")]),v._v(" 全局方法")]),v._v(" "),_("li",[v._v("更改:持久化存储 LightCache 的逻辑,修复一个愚蠢的容易造成误用的方式")]),v._v(" "),_("li",[v._v("新增:LightCache 方法 "),_("code",[v._v("addPersistence()")]),v._v(" 和 "),_("code",[v._v("removePersistence()")])]),v._v(" "),_("li",[v._v("新增:框架启动短指令 "),_("code",[v._v("./zhamao")]),v._v(" 或 "),_("code",[v._v("php zhamao")])])]),v._v(" "),_("h2",{attrs:{id:"v2-4-1-build-401"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-1-build-401"}},[v._v("#")]),v._v(" v2.4.1 (build 401)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.3.25")])]),v._v(" "),_("ul",[_("li",[v._v("修复:开启框架时导致的报错")])]),v._v(" "),_("h2",{attrs:{id:"v2-4-0-build-400"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-4-0-build-400"}},[v._v("#")]),v._v(" v2.4.0(build 400)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.3.25")])]),v._v(" "),_("ul",[_("li",[v._v("新增:检查全局配置文件的命令")]),v._v(" "),_("li",[v._v("新增:全局配置文件更新记录")]),v._v(" "),_("li",[v._v("依赖变更:"),_("strong",[v._v("Swoole 最低版本需要 4.5.0")])]),v._v(" "),_("li",[v._v("优化:reload 和 stop 命令重载和停止框架的逻辑")]),v._v(" "),_("li",[v._v("新增:"),_("code",[v._v("$_running_annotation")]),v._v(" 变量,可在注解事件中的类使用")]),v._v(" "),_("li",[v._v("新增:远程终端(Remote Terminal),弥补原来删掉的本地终端,通过 nc 命令连接即可")]),v._v(" "),_("li",[v._v("新增:启动参数 "),_("code",[v._v("--worker-num")]),v._v(","),_("code",[v._v("--task-worker-num")]),v._v(","),_("code",[v._v("--remote-terminal")])]),v._v(" "),_("li",[v._v("更新:全局配置文件结构")]),v._v(" "),_("li",[v._v("新增:Swoole 计时器报错处理")]),v._v(" "),_("li",[v._v("新增:全局方法("),_("code",[v._v("zm_dump()")]),v._v(","),_("code",[v._v("zm_error()")]),v._v(","),_("code",[v._v("zm_warning()")]),v._v(","),_("code",[v._v("zm_info()")]),v._v(","),_("code",[v._v("zm_success()")]),v._v(","),_("code",[v._v("zm_verbose()")]),v._v(","),_("code",[v._v("zm_debug()")]),v._v(","),_("code",[v._v("zm_config()")]),v._v(")")]),v._v(" "),_("li",[v._v("新增:示例模块的图灵机器人和 at 机器人的处理函数")]),v._v(" "),_("li",[v._v("新增:MessageUtil 工具类新增 "),_("code",[v._v("isAtMe(), splitCommand(), matchCommand()")]),v._v(" 方法")]),v._v(" "),_("li",[v._v("新增:ProcessManager 进程管理类新增 "),_("code",[v._v("workerAction(), sendActionToWorker(), resumeAllWorkerCoroutines()")]),v._v(" 方法")]),v._v(" "),_("li",[v._v("优化:CQCommand 的匹配逻辑")]),v._v(" "),_("li",[v._v("新增:支持添加自定义远程终端指令的 "),_("code",[v._v("@TerminalCommand")]),v._v(" 注解")]),v._v(" "),_("li",[v._v("新增:图灵机器人 API 封装函数")]),v._v(" "),_("li",[v._v("新增:ZMUtil 工具杂项类 "),_("code",[v._v("getReloadableFiles()")]),v._v(" 函数")]),v._v(" "),_("li",[v._v("新增:"),_("code",[v._v("vendor/bin/start systemd:generate")]),v._v(" 生成 systemd 配置文件的功能")]),v._v(" "),_("li",[v._v("新增:"),_("code",[v._v("vendor/bin/start check:config")]),v._v(" 检查配置文件更新的命令")]),v._v(" "),_("li",[v._v("新增:"),_("code",[v._v("vendor/bin/start init")]),v._v(" 新增 "),_("code",[v._v("--force")]),v._v(" 参数,覆盖现有文件重新生成")]),v._v(" "),_("li",[v._v("新增:MessageUtil 新增方法:"),_("code",[v._v("addShortCommand()")]),v._v(",用于快速添加静态文本问答回复的")])]),v._v(" "),_("p",[v._v("以下是需要"),_("strong",[v._v("手动更新")]),v._v("或"),_("strong",[v._v("更换新写法")]),v._v("的部分:")]),v._v(" "),_("ul",[_("li",[v._v("配置文件 "),_("code",[v._v("global.php")]),v._v(" 中的 "),_("code",[v._v("modules")]),v._v(" 字段展开,内置模块的配置一律平铺到外面。详见 "),_("a",{attrs:{href:"/update/config"}},[v._v("更新日志 - 配置文件变更")]),v._v("。")])]),v._v(" "),_("p",[v._v("以下是默认机器人直接连接产生的变更:")]),v._v(" "),_("ul",[_("li",[v._v("2.4.0 新增了默认回复其他人 at 的消息,如果不需要,请将 "),_("code",[v._v("Hello.php")]),v._v(" 中的 "),_("code",[v._v("changeAt()")]),v._v(" 和 "),_("code",[v._v("turingAPI()")]),v._v(" 方法删除。")])]),v._v(" "),_("h2",{attrs:{id:"v2-3-5-build-398"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-3-5-build-398"}},[v._v("#")]),v._v(" v2.3.5 (build 398)")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.3.23")])]),v._v(" "),_("ul",[_("li",[v._v("修复:MySQL 数据库查询导致的一系列问题")]),v._v(" "),_("li",[v._v("修复:内存泄露问题")])]),v._v(" "),_("blockquote",[_("p",[v._v("2.3.2-2.3.4 版本由于操作失误导致代码不完整,请直接使用 2.3.5 即可。")])]),v._v(" "),_("h2",{attrs:{id:"v2-3-1"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-3-1"}},[v._v("#")]),v._v(" v2.3.1")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.3.18")])]),v._v(" "),_("ul",[_("li",[v._v("规范代码,修复一个小报错的 bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-3-0"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-3-0"}},[v._v("#")]),v._v(" v2.3.0")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.3.16")])]),v._v(" "),_("ul",[_("li",[v._v("新增:MessageUtil 消息处理工具类")]),v._v(" "),_("li",[v._v("新增:TaskManager,封装了 TaskWorker 进程的应用")]),v._v(" "),_("li",[v._v("新增:CQObject,使用 "),_("code",[v._v("CQ::getCQ()")]),v._v(" 可获取对象形式的 CQ 码解析结果")]),v._v(" "),_("li",[v._v("新增:"),_("code",[v._v("@OnTask")]),v._v(" 注解,绑定任务函数")]),v._v(" "),_("li",[v._v("新增:RouteManager 路由管理类,可快速添加路由")]),v._v(" "),_("li",[v._v("修复:"),_("code",[v._v("ZM_DATA")]),v._v(" 和 "),_("code",[v._v("DataProvider::getDataFolder()")]),v._v(" 返回 false 的问题")]),v._v(" "),_("li",[v._v("优化:关闭显示停止框架后多余的输出信息")])]),v._v(" "),_("p",[v._v("注:本次升级建议升级后合并全局配置文件,有一些新加的内容。")]),v._v(" "),_("h2",{attrs:{id:"v2-2-11"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-11"}},[v._v("#")]),v._v(" v2.2.11")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.3.13")])]),v._v(" "),_("ul",[_("li",[v._v("新增:内部 ID 版本号(ZM_VERSION_ID)")]),v._v(" "),_("li",[v._v("优化:启动时 log 的等级")]),v._v(" "),_("li",[v._v("移除:终端输入命令")]),v._v(" "),_("li",[v._v("修复:纯 HTTP 服务器的启动 bug")]),v._v(" "),_("li",[v._v("新增:"),_("code",[v._v("zm_timer")]),v._v(" 的报错处理,防止服务器直接崩掉")])]),v._v(" "),_("h2",{attrs:{id:"v2-2-10"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-10"}},[v._v("#")]),v._v(" v2.2.10")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.3.8")])]),v._v(" "),_("ul",[_("li",[v._v("新增:用户态 php 编译脚本 "),_("code",[v._v("build-runtime.sh")])]),v._v(" "),_("li",[v._v("移除:无用的调试信息")]),v._v(" "),_("li",[v._v("新增:"),_("code",[v._v("--show-php-ver")]),v._v(" 启动参数")])]),v._v(" "),_("h2",{attrs:{id:"v2-2-9"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-9"}},[v._v("#")]),v._v(" v2.2.9")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.3.6")])]),v._v(" "),_("ul",[_("li",[v._v("更新:"),_("code",[v._v("reply()")]),v._v(" 方法传入数组则变为快速相应的 API 操作")]),v._v(" "),_("li",[v._v("修复:在 Worker 进程下调用 "),_("code",[v._v("ZMUtil::reload()")]),v._v(" 会导致一些奇怪的 bug")]),v._v(" "),_("li",[v._v("修复:"),_("code",[v._v("reply()")]),v._v(" 时会 at 私聊成员的 bug(由 go-cqhttp 导致)")])]),v._v(" "),_("h2",{attrs:{id:"v2-2-8"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-8"}},[v._v("#")]),v._v(" v2.2.8")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.3.2")])]),v._v(" "),_("ul",[_("li",[v._v("更新:MOTD 显示的方式,更加直观和炫酷")])]),v._v(" "),_("h2",{attrs:{id:"v2-2-7"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-7"}},[v._v("#")]),v._v(" v2.2.7")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.2.27")])]),v._v(" "),_("ul",[_("li",[v._v("修复:2.2.6 版本下 "),_("code",[v._v("reply()")]),v._v(" 方法在群里调用会 at 成员的 bug")]),v._v(" "),_("li",[v._v("修复:空 "),_("code",[v._v("access_token")]),v._v(" 的情况下会无法连入的 bug")]),v._v(" "),_("li",[v._v("修复:使用 Closure 闭包函数自行编写逻辑的判断返回 false 无法阻断连接的 bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-2-6"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-6"}},[v._v("#")]),v._v(" v2.2.6")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.2.26")])]),v._v(" "),_("ul",[_("li",[v._v("新增:"),_("code",[v._v("uuidgen()")]),v._v(" 全局函数,快速生成 uuid")]),v._v(" "),_("li",[v._v("修复:MySQL "),_("code",[v._v("rawQuery()")]),v._v(" 在参数为非数组时会报 Warning 的 bug")]),v._v(" "),_("li",[v._v("新增:示例模块的 API 示例:一言查询")]),v._v(" "),_("li",[v._v("优化:删减部分无用代码")]),v._v(" "),_("li",[v._v("更改:"),_("code",[v._v("ctx()->reply()")]),v._v(" 方法改为调用隐藏方法:"),_("code",[v._v(".handle_quick_operation")])]),v._v(" "),_("li",[v._v("修复:"),_("code",[v._v("ctx()->finalReply()")]),v._v(" 一直以来的 bug(未阻断事件)")]),v._v(" "),_("li",[v._v("新增:"),_("code",[v._v("access_token")]),v._v(" 配置项支持闭包函数自行设计判断方式和逻辑")]),v._v(" "),_("li",[v._v("新增:全局函数 "),_("code",[v._v("working_dir()")])])]),v._v(" "),_("h2",{attrs:{id:"v2-2-5"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-5"}},[v._v("#")]),v._v(" v2.2.5")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.2.20")])]),v._v(" "),_("ul",[_("li",[v._v("新增:"),_("code",[v._v("saveToJson()")]),v._v(" 和 "),_("code",[v._v("loadFromJson()")]),v._v(" 方法(DataProvider 类)")]),v._v(" "),_("li",[v._v("修复:"),_("code",[v._v("@OnSave")]),v._v(" 注解事件无法工作的 bug")]),v._v(" "),_("li",[v._v("调整:自定义计时器创建时的性能调优")]),v._v(" "),_("li",[v._v("新增:WorkerCache 方法:"),_("code",[v._v("hasKey()")])]),v._v(" "),_("li",[v._v("新增:SpinLock 方法:"),_("code",[v._v("transaction()")]),v._v("(直接在事务中上锁)")]),v._v(" "),_("li",[v._v("新增:CQ 方法:"),_("code",[v._v("getAllCQ()")]),v._v(","),_("code",[v._v("_custom()")]),v._v("(获取消息中的所有 CQ 码)")]),v._v(" "),_("li",[v._v("修复:CQ 类中的部分 bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-2-4"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-4"}},[v._v("#")]),v._v(" v2.2.4")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.2.7")])]),v._v(" "),_("ul",[_("li",[v._v("修复:终端交互导致的 ssh 断掉后 CPU 占用过高的问题")]),v._v(" "),_("li",[v._v("修复:WorkerCache 在缺少配置文件下工作异常的问题")]),v._v(" "),_("li",[v._v("新增:全局函数:"),_("code",[v._v("zm_atomic()")])])]),v._v(" "),_("h2",{attrs:{id:"v2-2-3"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-3"}},[v._v("#")]),v._v(" v2.2.3")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.1.30")])]),v._v(" "),_("ul",[_("li",[v._v("修复:waitMessage() 在 v2.2.2 版本中不可用的 bug")]),v._v(" "),_("li",[v._v("修复:access_token 无效的问题")])]),v._v(" "),_("h2",{attrs:{id:"v2-2-2"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-2"}},[v._v("#")]),v._v(" v2.2.2")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.1.29")])]),v._v(" "),_("ul",[_("li",[v._v("修复:模块文件错误时避免循环报错")]),v._v(" "),_("li",[v._v("优化:代码结构")]),v._v(" "),_("li",[v._v("修复:在不同进程时调用机器人 API 无法返回且报错的 bug")]),v._v(" "),_("li",[_("strong",[v._v("修复:机器人无法连接的问题(2.1.6 ~ 2.2.1 受影响)")])])]),v._v(" "),_("h2",{attrs:{id:"v2-2-1"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-1"}},[v._v("#")]),v._v(" v2.2.1")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.1.29")])]),v._v(" "),_("ul",[_("li",[v._v("修复:配置文件兼容性问题")])]),v._v(" "),_("h2",{attrs:{id:"v2-2-0"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-2-0"}},[v._v("#")]),v._v(" v2.2.0")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.1.29")])]),v._v(" "),_("ul",[_("li",[v._v("新增:"),_("code",[v._v("@OnPipeMessageEvent")]),v._v(" 注解")]),v._v(" "),_("li",[v._v("新增:进程管理器")]),v._v(" "),_("li",[v._v("新增:"),_("code",[v._v("--daemon")]),v._v(" 守护进程化后查看状态以及一系列操作的命令行")]),v._v(" "),_("li",[v._v("新增:WorkerCache")]),v._v(" "),_("li",[v._v("修复:路由问题")]),v._v(" "),_("li",[v._v("修复:"),_("code",[v._v("http_header")]),v._v(" 配置项不生效的 bug")]),v._v(" "),_("li",[v._v("优化:框架内部所有异常全部基于 "),_("code",[v._v("ZMException")])]),v._v(" "),_("li",[v._v("优化:SingletonTrait 支持扩展")])]),v._v(" "),_("h2",{attrs:{id:"v2-1-6"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-1-6"}},[v._v("#")]),v._v(" v2.1.6")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.1.18")])]),v._v(" "),_("ul",[_("li",[v._v("优化:代码结构")]),v._v(" "),_("li",[v._v("增加:更多提示语")]),v._v(" "),_("li",[v._v("修复:处理空格消息时的报错")]),v._v(" "),_("li",[v._v("修复:上下文的bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-1-5"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-1-5"}},[v._v("#")]),v._v(" v2.1.5")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.1.13")])]),v._v(" "),_("ul",[_("li",[v._v("优化:终端对 PHP Warning 和 PHP Notice 的报错信息显示,统一格式")]),v._v(" "),_("li",[v._v("新增:"),_("code",[v._v("ctx()->getNumArg()")]),v._v(" 上下文中快速获取数字类型的参数的方法")]),v._v(" "),_("li",[v._v("优化:删除不必要的调试信息")]),v._v(" "),_("li",[v._v("优化:路由组件全面替换为 "),_("code",[v._v("symfony/routing")]),v._v(",兼容性和稳定性 up!")])]),v._v(" "),_("h2",{attrs:{id:"v2-1-4"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-1-4"}},[v._v("#")]),v._v(" v2.1.4")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.1.3")])]),v._v(" "),_("ul",[_("li",[v._v("修复:启动时会提示丢失类的 bug")]),v._v(" "),_("li",[v._v("优化:HTTP 响应类如果被使用了则一律返回 false")]),v._v(" "),_("li",[v._v("优化:PHP Warning 等报错统一样式")])]),v._v(" "),_("h2",{attrs:{id:"v2-1-3"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-1-3"}},[v._v("#")]),v._v(" v2.1.3")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.1.2")])]),v._v(" "),_("ul",[_("li",[v._v("修复:注解解析器在某种特殊情况下导致的 bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-1-2"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-1-2"}},[v._v("#")]),v._v(" v2.1.2")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.1.2")])]),v._v(" "),_("ul",[_("li",[v._v("修复:引入包模式启动时会导致的满屏报错")])]),v._v(" "),_("h2",{attrs:{id:"v2-1-1"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-1-1"}},[v._v("#")]),v._v(" v2.1.1")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.1.2")])]),v._v(" "),_("ul",[_("li",[v._v("修复:自定义加载注解选定 composer.json 文件错误的 bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-1-0"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-1-0"}},[v._v("#")]),v._v(" v2.1.0")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2021.1.2")])]),v._v(" "),_("ul",[_("li",[v._v("新增:"),_("code",[v._v("@OnOpenEvent")]),v._v(","),_("code",[v._v("@OnCloseEvent")]),v._v(","),_("code",[v._v("@OnMessageEvent")]),v._v(","),_("code",[v._v("@OnRequestEvent")])]),v._v(" "),_("li",[v._v("优化事件分发器,修复一些事件分发过程中的 bug")]),v._v(" "),_("li",[v._v("修复 "),_("code",[v._v("@CQBefore")]),v._v(" 事件的 bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-0-3"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-0-3"}},[v._v("#")]),v._v(" v2.0.3")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2020.12.31")])]),v._v(" "),_("ul",[_("li",[v._v("修复:CQBefore 注解事件在 level 低于 200 时无法调用的 bug")]),v._v(" "),_("li",[v._v("修复:CQMetaEvent 注解事件调用时报错的 bug")])]),v._v(" "),_("h2",{attrs:{id:"v2-0-2"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-0-2"}},[v._v("#")]),v._v(" v2.0.2")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2020.12.31")])]),v._v(" "),_("ul",[_("li",[v._v("更新:将 CQ 码调用类更新到与最新 OneBot 标准相兼容的状态")])]),v._v(" "),_("h2",{attrs:{id:"v2-0-1"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-0-1"}},[v._v("#")]),v._v(" v2.0.1")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2020.12.23")])]),v._v(" "),_("ul",[_("li",[v._v("修复:开屏报错文件夹不存在")])]),v._v(" "),_("h2",{attrs:{id:"v2-0"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#v2-0"}},[v._v("#")]),v._v(" v2.0")]),v._v(" "),_("blockquote",[_("p",[v._v("更新时间:2020.12.23")])]),v._v(" "),_("p",[v._v("已发布正式版。")])])}),[],!1,null,null,null);_.default=o.exports}}]); |