/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
common/components/Connection.php
132 строки
3 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php namespace common\components; use Yii; use yii\db\Exception; /** * Доработка транзакций * * @author Dmitry E. Semenov <sde.tomsk@gmail.com> * @copyright Self (c) 2019 */ class Connection extends \yii\db\Connection { public $schemaMap = [ 'mysqli' => 'common\components\Schema', // MySQL 'mysql' => 'common\components\Schema', // MySQL ]; /** * Откат транзации в определённом уровне * @param $transaction * @param $level */ private function rollbackTransaction($transaction, $level) { if ($transaction->isActive && $transaction->level === $level) { // https://github.com/yiisoft/yii2/pull/13347 try { $transaction->rollBack(); } catch (\Exception $e) { \Yii::error($e, __METHOD__); // hide this exception to be able to continue throwing original exception outside } } } /** * Выполнение соъранения данных в транзацкии * * @param callable $callback * @return bool|mixed * @throws \Throwable */ public function saveTransaction(callable $callback) { $transaction = $this->beginTransaction(); $level = $transaction->level; try { $result = call_user_func($callback, $this); if ($transaction->isActive && $transaction->level === $level) { if ($result) { $transaction->commit(); } else { $transaction->rollBack(); } } } catch (\Exception $e) { $this->rollbackTransaction($transaction, $level); throw $e; } catch (\Throwable $e) { $this->rollbackTransaction($transaction, $level); throw $e; } return $result; } /** * Проверка работоспособности сервера БД * Несколько попыток * * @return bool * @throws Exception */ public function pingRepeat() { $index = 1; do { $result = $this->ping(); if (!$result) { // ожидание перед повтором sleep(1); } $index++; } while (!$result and $index < 3); return true; } /** * Проверка работоспособности сервера БД * * @throws Exception */ public function ping() { $reconnect = false; try { try { Yii::info('ping'); $this->createCommand('SELECT 1')->query(); Yii::info('pong'); } catch (\Exception $exception) { $reconnect = true; Yii::info($exception->getMessage()); } catch (\Throwable $exception) { $reconnect = true; Yii::info($exception->getMessage()); } } finally { if ($reconnect) { Yii::info('reconnecting'); $this->close(); $this->open(); Yii::info('reconnected'); } else { Yii::info('ping-pong'); } } } }