jerry 6155236d3c update to v2.4.0 (build 399)
add CheckConfigCommand.php
add config update record docs
adjust swoole version to 4.5.0
fix stop and reload bugs
add $_running_annotation
add remote terminal
update global config
add timer tick exception handler
add zm_xxx global functions
add isAtMe(), splitCommand(), matchCommand() function for MessageUtil
add workerAction(), sendActionToWorker(), resumeAllWorkerCoroutines() functions for ProcessManager
optimize CQCommand match function
add custom TerminalCommand annotation
add TuringAPI
add getReloadableFiles() function for ZMUtil
2021-03-24 23:34:46 +08:00

2.5 KiB
Raw Blame History

ZMUtil 杂项工具类

调用前先 useuse ZM\Utils\ZMUtil;

ZMUtil::stop()

停止框架运行。

ZMUtil::reload()

重载框架,这会断开所有到框架的连接和重载所有 src/ 目录下的用户源码并重新加载所有 Worker 进程。

ZMUtil::getModInstance()

根据类名称拿到此类的单例(前提是目标的类的构造函数为空)。

class ASD{
    public $test = 0;
}
ZMUtil::getModInstance(ASD::class)->test = 5;

ZMUtil::getReloadableFiles()

返回可通过热重启reload来重新加载的 php 文件列表。

以下是示例模块下的例子(直接拉取最新的框架源码并运行框架后获取的)。

array:31 [
  94 => "src/ZM/Context/Context.php"
  95 => "src/ZM/Context/ContextInterface.php"
  96 => "src/ZM/Annotation/AnnotationParser.php"
  97 => "src/Custom/Annotation/Example.php"
  98 => "src/ZM/Annotation/Interfaces/CustomAnnotation.php"
  99 => "src/Module/Example/Hello.php"
  100 => "src/ZM/Annotation/Swoole/OnStart.php"
  101 => "src/ZM/Annotation/CQ/CQCommand.php"
  102 => "src/ZM/Annotation/Interfaces/Level.php"
  103 => "src/ZM/Annotation/Command/TerminalCommand.php"
  104 => "src/ZM/Annotation/Http/RequestMapping.php"
  105 => "src/ZM/Annotation/Http/RequestMethod.php"
  106 => "src/ZM/Annotation/Http/Middleware.php"
  107 => "src/ZM/Annotation/Interfaces/ErgodicAnnotation.php"
  108 => "src/ZM/Annotation/Swoole/OnOpenEvent.php"
  109 => "src/ZM/Annotation/Swoole/OnSwooleEventBase.php"
  110 => "src/ZM/Annotation/Interfaces/Rule.php"
  111 => "src/ZM/Annotation/Swoole/OnCloseEvent.php"
  112 => "src/ZM/Annotation/Swoole/OnRequestEvent.php"
  113 => "src/ZM/Http/RouteManager.php"
  114 => "vendor/symfony/routing/RouteCollection.php"
  115 => "vendor/symfony/routing/Route.php"
  116 => "src/Module/Middleware/TimerMiddleware.php"
  117 => "src/ZM/Http/MiddlewareInterface.php"
  118 => "src/ZM/Annotation/Http/MiddlewareClass.php"
  119 => "src/ZM/Annotation/Http/HandleBefore.php"
  120 => "src/ZM/Annotation/Http/HandleAfter.php"
  121 => "src/ZM/Annotation/Http/HandleException.php"
  122 => "src/ZM/Event/EventManager.php"
  123 => "src/ZM/Annotation/Swoole/OnSwooleEvent.php"
  124 => "src/ZM/Event/EventDispatcher.php"
]

为什么不能重载所有文件?因为框架是多进程模型,而重载相当于只重新启动了一次 Worker 进程Manager 和 Master 进程未重启,所以被 Manager、Master 进程已经加载的 PHP 文件无法使用 reload 命令重新加载。详见 进阶 - 进程间隔离