diff --git a/src/ZM/Event/SwooleEvent/OnWorkerStart.php b/src/ZM/Event/SwooleEvent/OnWorkerStart.php index a5762eaf..fb725c7d 100644 --- a/src/ZM/Event/SwooleEvent/OnWorkerStart.php +++ b/src/ZM/Event/SwooleEvent/OnWorkerStart.php @@ -34,11 +34,13 @@ use ZM\Exception\ZMKnownException; use ZM\Framework; use ZM\MySQL\MySQLPool; use ZM\Store\LightCacheInside; +use ZM\Store\Lock\SpinLock; use ZM\Store\MySQL\SqlPoolStorage; use ZM\Store\Redis\ZMRedisPool; use ZM\Utils\DataProvider; use ZM\Utils\Manager\CronManager; use ZM\Utils\Manager\ModuleManager; +use ZM\Utils\Manager\ProcessManager; use ZM\Utils\SignalListener; /** @@ -58,7 +60,7 @@ class OnWorkerStart implements SwooleEvent $this->registerWorkerContainerBindings($server); if ($server->taskworker === false) { - Framework::saveProcessState(ZM_PROCESS_WORKER, $server->worker_pid, ['worker_id' => $worker_id]); + ProcessManager::saveProcessState(ZM_PROCESS_WORKER, $server->worker_pid, ['worker_id' => $worker_id]); zm_atomic('_#worker_' . $worker_id)->set($server->worker_pid); if (LightCacheInside::get('wait_api', 'wait_api') !== null) { LightCacheInside::unset('wait_api', 'wait_api'); @@ -109,12 +111,13 @@ class OnWorkerStart implements SwooleEvent } else { Console::warning('@OnStart 执行异常!'); } - Console::success('Worker #' . $worker_id . ' started'); + Console::verbose('Worker #' . $worker_id . ' started'); + $this->gatherWorkerStartStatus(); } catch (Exception $e) { if ($e->getMessage() === 'swoole exit') { return; } - Console::error('Worker加载出错!停止服务!'); + Console::error('Worker #' . $server->worker_id . ' 加载出错!停止服务!'); Console::error(zm_internal_errcode('E00030') . 'Uncaught ' . get_class($e) . ': ' . $e->getMessage() . "\n" . $e->getTraceAsString()); Process::kill($server->master_pid, SIGTERM); return; @@ -128,13 +131,13 @@ class OnWorkerStart implements SwooleEvent } } else { // 这里是TaskWorker初始化的内容部分 - Framework::saveProcessState(ZM_PROCESS_TASKWORKER, $server->worker_pid, ['worker_id' => $worker_id]); + ProcessManager::saveProcessState(ZM_PROCESS_TASKWORKER, $server->worker_pid, ['worker_id' => $worker_id]); try { Framework::$server = $server; $this->loadAnnotations(); - Console::success('TaskWorker #' . $server->worker_id . ' started'); + Console::verbose('TaskWorker #' . $server->worker_id . ' started'); } catch (Exception $e) { - Console::error('Worker加载出错!停止服务!'); + Console::error('TaskWorker #' . $server->worker_id . ' 加载出错!停止服务!'); Console::error(zm_internal_errcode('E00030') . $e->getMessage() . "\n" . $e->getTraceAsString()); Process::kill($server->master_pid, SIGTERM); return; @@ -314,4 +317,21 @@ class OnWorkerStart implements SwooleEvent $container->singleton(AdapterInterface::class, OneBot11Adapter::class); } + + private function gatherWorkerStartStatus() + { + SpinLock::lock('worker_start_status'); + $ls = LightCacheInside::get('tmp_kv', 'worker_start_status') ?? []; + $ls[\server()->worker_id] = true; + if (count($ls) === \server()->setting['worker_num']) { + LightCacheInside::set('tmp_kv', 'worker_start_status', $ls); + SpinLock::unlock('worker_start_status'); + $used = round((microtime(true) - LightCacheInside::get('tmp_kv', 'start_time')) * 1000, 3); + $worker_count = \server()->setting['worker_num']; + Console::success("{$worker_count} 个工作进程成功启动,共用时 {$used} ms"); + } else { + LightCacheInside::set('tmp_kv', 'worker_start_status', $ls); + SpinLock::unlock('worker_start_status'); + } + } } diff --git a/src/ZM/Store/LightCacheInside.php b/src/ZM/Store/LightCacheInside.php index edd86990..347223c2 100644 --- a/src/ZM/Store/LightCacheInside.php +++ b/src/ZM/Store/LightCacheInside.php @@ -21,6 +21,7 @@ class LightCacheInside self::createTable('connect', 3, 64); // 用于存单机器人模式下的机器人fd的 self::createTable('static_route', 64, 256); // 用于存储 self::createTable('light_array', 8, 512, 0.6); + self::createTable('tmp_kv', 3, 512, 0.6); } catch (ZMException $e) { return false; } // 用于存协程等待的状态内容的