provider->on(OnWorkerStart::class, [$this, 'check']); $this->provider->on(OnTaskerStart::class, [$this, 'check']); $this->provider->on(OnWorkerExit::class, [$this, 'exit']); foreach ($databases as $key => $database) { $application->set($key, $this->_settings($database)); } } /** * @param OnWorkerExit $exit * @return void */ public function exit(OnWorkerExit $exit): void { $id = (int)Kiri\Context::getContext('db.loop.id'); if (!empty($id)) { $exit->server->clearTimer($id); } } /** * @param $name * @return Connection * @throws Exception */ public function get($name): Connection { return Kiri::app()->get($name); } /** * @param OnTaskerStart|OnWorkerStart $start * @return void */ public function check(OnTaskerStart|OnWorkerStart $start): void { $timerTick = $start->server->tick(50 * 1000, static function () use ($start) { $databases = Config::get('databases.connections', []); $logger = Kiri::getDi()->get(LoggerInterface::class); $logger->alert('db size ' . count($databases) . ' ticker ' . date('Y-m-d H:i:s')); if (!empty($databases)) { $valid = 0; $count = 0; $connection = Kiri::getDi()->get(PoolConnection::class); foreach ($databases as $database) { [$total, $success] = $connection->check($database['cds']); $count += $total; $valid += $success; if (isset($database['slaveConfig']) && isset($database['slaveConfig']['cds'])) { if ($database['slaveConfig']['cds'] != $database['cds']) { [$total, $success] = $connection->check($database['slaveConfig']['cds']); $count += $total; $valid += $success; } } } $message = sprintf('Worker %d db client has %d, valid %d', $start->workerId, $count, $valid); $logger->alert($message); } }); Kiri\Context::setContext('db.loop.id', $timerTick); } /** * @param $database * @return array */ private function _settings($database): array { $clientPool = $database['pool'] ?? ['min' => 1, 'max' => 5, 'tick' => 60]; return [ 'id' => $database['id'], 'cds' => $database['cds'], 'class' => Connection::class, 'username' => $database['username'], 'password' => $database['password'], 'tablePrefix' => $database['tablePrefix'], 'database' => $database['database'], 'connect_timeout' => $database['connect_timeout'] ?? 30, 'read_timeout' => $database['read_timeout'] ?? 10, 'pool' => $clientPool, 'attributes' => $database['attributes'] ?? [], 'charset' => $database['charset'] ?? 'utf8mb4', 'slaveConfig' => $database['slaveConfig'] ]; } }