diff --git a/src/ZM/Event/Listener/WorkerEventListener.php b/src/ZM/Event/Listener/WorkerEventListener.php index 3213819d..7658bc32 100644 --- a/src/ZM/Event/Listener/WorkerEventListener.php +++ b/src/ZM/Event/Listener/WorkerEventListener.php @@ -109,7 +109,8 @@ class WorkerEventListener } // Windows 系统的 CtrlC 由于和 Select 有一定的冲突,如果没事件解析的话 CtrlC 会阻塞,所以必须添加一个空的计时器 if (PHP_OS_FAMILY === 'Windows') { - Framework::getInstance()->getDriver()->getEventLoop()->addTimer(1000, function () {}, 0); + Framework::getInstance()->getDriver()->getEventLoop()->addTimer(1000, function () { + }, 0); } // 回显 debug 日志:进程占用的内存 $memory_total = memory_get_usage() / 1024 / 1024; @@ -121,6 +122,14 @@ class WorkerEventListener logger()->debug('{is_task}Worker 进程 #{id} 已启动', ['is_task' => ProcessStateManager::isTaskWorker() ? 'Task' : '', 'id' => ProcessManager::getProcessId()]); } + public function onWorkerExit(): void + { + // 清除计时器 + Framework::getInstance()->getDriver()->getEventLoop()->clearAllTimer(); + $worker_id = ProcessManager::getProcessId(); + logger()->notice('正在结束 Worker #' . $worker_id . ' 中的任务...'); + } + /** * @throws ZMKnownException * @throws \JsonException @@ -132,6 +141,11 @@ class WorkerEventListener } logger()->debug('{is_task}Worker 进程 #{id} 正在停止', ['is_task' => ProcessStateManager::isTaskWorker() ? 'Task' : '', 'id' => ProcessManager::getProcessId()]); + if (Framework::getInstance()->getDriver()->getName() !== 'swoole') { + logger()->debug('清除计时器中'); + Framework::getInstance()->getDriver()->getEventLoop()->clearAllTimer(); + } + if (DIRECTORY_SEPARATOR !== '\\') { ProcessStateManager::removeProcessState(ProcessStateManager::isTaskWorker() ? ZM_PROCESS_TASKWORKER : ZM_PROCESS_WORKER, ProcessManager::getProcessId()); } diff --git a/src/ZM/Framework.php b/src/ZM/Framework.php index 84de090d..325961ee 100644 --- a/src/ZM/Framework.php +++ b/src/ZM/Framework.php @@ -9,6 +9,7 @@ use OneBot\Driver\Event\DriverInitEvent; use OneBot\Driver\Event\Http\HttpRequestEvent; use OneBot\Driver\Event\Process\ManagerStartEvent; use OneBot\Driver\Event\Process\ManagerStopEvent; +use OneBot\Driver\Event\Process\WorkerExitEvent; use OneBot\Driver\Event\Process\WorkerStartEvent; use OneBot\Driver\Event\Process\WorkerStopEvent; use OneBot\Driver\Event\WebSocket\WebSocketCloseEvent; @@ -235,6 +236,7 @@ class Framework ob_event_provider()->addEventListener(WorkerStartEvent::getName(), [WorkerEventListener::getInstance(), 'onWorkerStart1'], 1); ob_event_provider()->addEventListener(WorkerStopEvent::getName(), [WorkerEventListener::getInstance(), 'onWorkerStop999'], 999); ob_event_provider()->addEventListener(WorkerStopEvent::getName(), [WorkerEventListener::getInstance(), 'onWorkerStop1'], 1); + ob_event_provider()->addEventListener(WorkerExitEvent::getName(), [WorkerEventListener::getInstance(), 'onWorkerExit'], 999); // Http 事件 ob_event_provider()->addEventListener(HttpRequestEvent::getName(), [HttpEventListener::getInstance(), 'onRequest999'], 999); ob_event_provider()->addEventListener(HttpRequestEvent::getName(), [HttpEventListener::getInstance(), 'onRequest1'], 1);