get(Kiri\Main::class); $main->command(BackupCommand::class); $databases = Config::get('databases.connections', []); if (empty($databases)) { return; } $this->provider->on(OnWorkerExit::class, [$this, 'exit'], 9999); $this->provider->on(OnWorkerStart::class, [$this, 'start']); foreach ($databases as $key => $database) { $application->set($key, $this->_settings($database)); } } public function start(OnWorkerStart $start) { if (!Kiri\Di\Context::inCoroutine()) { return; } Timer::tick(60000, function () { $databases = Config::get('databases.connections', []); if (empty($databases)) { return; } $connection = Kiri::getDi()->get(PoolConnection::class); foreach ($databases as $database) { $connection->flush($database['cds'] . 'master', $database['pool']['min'] ?? 1); $slaveCds = ($database['slaveConfig']['cds'] ?? $database['cds']) . 'slave'; $connection->flush($slaveCds, $database['pool']['min'] ?? 1); } }); } /** * @param OnWorkerExit $exit * @return void * @throws ConfigException * @throws Exception */ public function exit(OnWorkerExit $exit): void { Timer::clearAll(); $databases = Config::get('databases.connections', []); if (!empty($databases)) { $connection = Kiri::getDi()->get(PoolConnection::class); foreach ($databases as $database) { $connection->disconnect($database['cds'] . 'master'); $slaveCds = ($database['slaveConfig']['cds'] ?? $database['cds']) . 'slave'; $connection->disconnect($slaveCds); } } } /** * @param $name * @return Connection * @throws Exception */ public function get($name): Connection { return Kiri::service()->get($name); } /** * @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'] ]; } }