PHPackages                             beeline/yii2-circuit-breaker - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. beeline/yii2-circuit-breaker

ActiveYii2-extension[Utility &amp; Helpers](/categories/utility)

beeline/yii2-circuit-breaker
============================

Circuit Breaker pattern implementation for Yii2 to prevent cascading failures

1.0.7(6mo ago)0372LGPL-3.0-or-laterPHPPHP ^8.4CI passing

Since Nov 7Pushed 6mo agoCompare

[ Source](https://github.com/pozitronik/yii2-circuit-breaker)[ Packagist](https://packagist.org/packages/beeline/yii2-circuit-breaker)[ RSS](/packages/beeline-yii2-circuit-breaker/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (3)Versions (9)Used By (2)

Circuit Breaker для Yii2
========================

[](#circuit-breaker-для-yii2)

[![Tests](https://github.com/pozitronik/yii2-circuit-breaker/actions/workflows/tests.yml/badge.svg)](https://github.com/pozitronik/yii2-circuit-breaker/actions/workflows/tests.yml)[![Codecov](https://camo.githubusercontent.com/4332449cc2a15f3040f5fa92e5d52a8cba9caadc734ce1ac736e768fa250602e/68747470733a2f2f636f6465636f762e696f2f67682f706f7a6974726f6e696b2f796969322d636972637569742d627265616b65722f6272616e63682f6d61737465722f67726170682f62616467652e737667)](https://codecov.io/gh/pozitronik/yii2-circuit-breaker)[![Packagist Version](https://camo.githubusercontent.com/355d2ad4e3aa15bd437927cbfdc9e1966f88888b2e1bdd0380418f7f42290f61/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6265656c696e652f796969322d636972637569742d627265616b6572)](https://packagist.org/packages/beeline/yii2-circuit-breaker)[![Packagist License](https://camo.githubusercontent.com/4d6bcd33b3cc7eb73898b7ef12807f730ddd1ef2ae43706804871536f5e39bfd/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f6265656c696e652f796969322d636972637569742d627265616b6572)](https://packagist.org/packages/beeline/yii2-circuit-breaker)[![Packagist Downloads](https://camo.githubusercontent.com/ebcb9fbcbf1c33772de204bdfdd1361d164629341625268ec823259789e72576/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6265656c696e652f796969322d636972637569742d627265616b6572)](https://packagist.org/packages/beeline/yii2-circuit-breaker)

Надёжная реализация паттерна Circuit Breaker для Yii2 приложений, предотвращающая каскадные сбои в распределённых системах.

Возможности
-----------

[](#возможности)

- **Три состояния**: CLOSED (нормальная работа), OPEN (блокировка запросов), HALF\_OPEN (тестирование восстановления)
- **Настраиваемые пороги**: Гибкая настройка частоты отказов, размера окна наблюдения и таймаутов
- **Скользящее окно**: Отслеживание истории последних запросов для точного расчёта частоты отказов
- **Автоматическое восстановление**: Тестирование работоспособности бэкенда после истечения таймаута
- **Нулевые зависимости**: Требуется только фреймворк Yii2
- **PHP 8.4+**: Современный PHP со строгой типизацией и новейшими возможностями

Установка
---------

[](#установка)

```
composer require beeline/yii2-circuit-breaker
```

Требования
----------

[](#требования)

- PHP &gt;= 8.4
- Yii2 &gt;= 2.0.45

Использование
-------------

[](#использование)

### Базовое использование

[](#базовое-использование)

```
use beeline\CircuitBreaker\CircuitBreaker;

$breaker = new CircuitBreaker([
    'failureThreshold' => 0.5,  // Открывать цепь при 50% отказов
    'windowSize' => 10,          // Отслеживать последние 10 запросов
    'timeout' => 30,             // Ждать 30 секунд перед тестированием восстановления
    'successThreshold' => 2,     // Требовать 2 успешных запроса для закрытия цепи
]);

// Проверяем, разрешён ли запрос
if ($breaker->allowsRequest()) {
    try {
        // Вызываем внешний сервис
        $result = $externalService->call();
        $breaker->recordSuccess();
    } catch (\Exception $e) {
        $breaker->recordFailure();
        throw $e;
    }
} else {
    // Цепь открыта, быстрый отказ
    throw new \RuntimeException('Сервис недоступен');
}
```

### Конфигурация

[](#конфигурация)

СвойствоТипПо умолчаниюОписание`failureThreshold`float0.5Частота отказов (0.0-1.0) для открытия цепи`windowSize`int10Количество отслеживаемых запросов`timeout`int30Секунды ожидания перед попыткой восстановления`successThreshold`int1Необходимое количество успешных запросов в состоянии HALF\_OPEN для закрытия цепи### Состояния цепи

[](#состояния-цепи)

#### CLOSED (Нормальная работа)

[](#closed-нормальная-работа)

- Все запросы разрешены
- Отказы отслеживаются в скользящем окне
- Цепь открывается при превышении порога отказов

#### OPEN (Блокировка запросов)

[](#open-блокировка-запросов)

- Запросы немедленно отклоняются
- Нет обращений к отказавшему бэкенду
- Переход в состояние HALF\_OPEN после истечения таймаута

#### HALF\_OPEN (Тестирование восстановления)

[](#half_open-тестирование-восстановления)

- Ограниченное количество запросов для тестирования бэкенда
- Закрывается при успешных запросах
- Повторно открывается при любом отказе

### Расширенное использование

[](#расширенное-использование)

#### Мониторинг состояния цепи

[](#мониторинг-состояния-цепи)

```
// Проверка текущего состояния
if ($breaker->isClosed()) {
    // Нормальная работа
}

if ($breaker->isOpen()) {
    // Цепь открыта, используем запасной вариант
}

if ($breaker->isHalfOpen()) {
    // Тестирование восстановления
}

// Получение детальной статистики
$stats = $breaker->getStats();
// Возвращает: ['total' => 10, 'failures' => 3, 'failureRate' => 0.3]
```

#### Ручное управление (для тестирования)

[](#ручное-управление-для-тестирования)

```
// Принудительное открытие цепи
$breaker->forceOpen();

// Принудительное закрытие цепи
$breaker->forceClose();

// Сброс в начальное состояние
$breaker->reset();
```

### Интеграция с внешними сервисами

[](#интеграция-с-внешними-сервисами)

```
use beeline\CircuitBreaker\CircuitBreaker;
use yii\httpclient\Client;

class ExternalApiClient
{
    private CircuitBreaker $breaker;
    private Client $http;

    public function __construct()
    {
        $this->breaker = new CircuitBreaker([
            'failureThreshold' => 0.6,
            'windowSize' => 20,
            'timeout' => 60,
        ]);

        $this->http = new Client(['baseUrl' => 'https://api.example.com']);
    }

    public function fetchData(string $endpoint): array
    {
        if (!$this->breaker->allowsRequest()) {
            throw new \RuntimeException('Circuit API открыт');
        }

        try {
            $response = $this->http->get($endpoint)->send();

            if ($response->isOk) {
                $this->breaker->recordSuccess();
                return $response->data;
            }

            $this->breaker->recordFailure();
            throw new \RuntimeException('Ошибка запроса к API');
        } catch (\Exception $e) {
            $this->breaker->recordFailure();
            throw $e;
        }
    }
}
```

Принцип работы
--------------

[](#принцип-работы)

1. **Скользящее окно**: Circuit breaker поддерживает окно фиксированного размера с результатами последних запросов
2. **Отслеживание отказов**: Результат каждого запроса (успех/отказ) записывается в окно
3. **Проверка порога**: Когда окно заполнено, частота отказов сравнивается с порогом
4. **Переходы между состояниями**:
    - CLOSED → OPEN: Частота отказов превышает порог
    - OPEN → HALF\_OPEN: Истекает таймаут
    - HALF\_OPEN → CLOSED: Достаточное количество успешных запросов
    - HALF\_OPEN → OPEN: Происходит любой отказ

Примеры использования
---------------------

[](#примеры-использования)

### Предотвращение перегрузки базы данных

[](#предотвращение-перегрузки-базы-данных)

```
use beeline\CircuitBreaker\CircuitBreaker;

class DatabaseService
{
    private CircuitBreaker $breaker;

    public function __construct()
    {
        $this->breaker = new CircuitBreaker([
            'failureThreshold' => 0.5,
            'windowSize' => 20,
            'timeout' => 10,
        ]);
    }

    public function executeQuery(string $sql): array
    {
        if (!$this->breaker->allowsRequest()) {
            // Возвращаем кешированные данные или бросаем исключение
            throw new \RuntimeException('База данных временно недоступна');
        }

        try {
            $result = Yii::$app->db->createCommand($sql)->queryAll();
            $this->breaker->recordSuccess();
            return $result;
        } catch (\Exception $e) {
            $this->breaker->recordFailure();
            throw $e;
        }
    }
}
```

### Защита от сбоев внешних API

[](#защита-от-сбоев-внешних-api)

```
use beeline\CircuitBreaker\CircuitBreaker;

class PaymentGateway
{
    private CircuitBreaker $breaker;

    public function __construct()
    {
        $this->breaker = new CircuitBreaker([
            'failureThreshold' => 0.3,  // Более чувствительный порог
            'windowSize' => 50,
            'timeout' => 60,
            'successThreshold' => 5,    // Требуем больше успехов для восстановления
        ]);
    }

    public function processPayment(array $paymentData): bool
    {
        if (!$this->breaker->allowsRequest()) {
            // Логируем событие и возвращаем ошибку
            Yii::error('Payment gateway circuit is open', __METHOD__);
            return false;
        }

        try {
            $response = $this->callPaymentApi($paymentData);
            $this->breaker->recordSuccess();
            return $response['success'];
        } catch (\Exception $e) {
            $this->breaker->recordFailure();
            Yii::error("Payment failed: {$e->getMessage()}", __METHOD__);
            return false;
        }
    }
}
```

### Мониторинг и алертинг

[](#мониторинг-и-алертинг)

```
use beeline\CircuitBreaker\CircuitBreaker;

class MonitoredService
{
    private CircuitBreaker $breaker;

    public function __construct()
    {
        $this->breaker = new CircuitBreaker([
            'failureThreshold' => 0.5,
            'windowSize' => 100,
            'timeout' => 30,
        ]);
    }

    public function call(): mixed
    {
        $state = $this->breaker->getState();

        // Отправляем метрики в систему мониторинга
        if ($state === 'open') {
            $this->sendAlert('Circuit breaker is OPEN');
        }

        if (!$this->breaker->allowsRequest()) {
            return $this->getFallbackData();
        }

        // ... выполнение запроса
    }

    public function getHealthStatus(): array
    {
        $stats = $this->breaker->getStats();

        return [
            'state' => $this->breaker->getState(),
            'total_requests' => $stats['total'],
            'failures' => $stats['failures'],
            'failure_rate' => $stats['failureRate'],
            'is_healthy' => $this->breaker->isClosed(),
        ];
    }
}
```

Тестирование
------------

[](#тестирование)

```
# Запуск тестов
vendor/bin/phpunit

# Запуск тестов с покрытием
vendor/bin/phpunit --coverage-html coverage/
```

Лицензия
--------

[](#лицензия)

GNU Lesser General Public License 3.0

###  Health Score

38

—

LowBetter than 85% of packages

Maintenance68

Regular maintenance activity

Popularity7

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

8

Last Release

186d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/76ddc43524bb32eb36568e25b6ae283bc25bb51a4572789997909092145af0f5?d=identicon)[pozitronik](/maintainers/pozitronik)

---

Top Contributors

[![pozitronik](https://avatars.githubusercontent.com/u/2357892?v=4)](https://github.com/pozitronik "pozitronik (9 commits)")

---

Tags

yii2circuit breakerfault toleranceresilience

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/beeline-yii2-circuit-breaker/health.svg)

```
[![Health](https://phpackages.com/badges/beeline-yii2-circuit-breaker/health.svg)](https://phpackages.com/packages/beeline-yii2-circuit-breaker)
```

###  Alternatives

[nizsheanez/yii2-asset-converter

Less, Sass, Scss and Phamlp converter for Yii2. No system requires. yii2-composer support, Less autoupdate, customizing of output directory

64167.5k6](/packages/nizsheanez-yii2-asset-converter)[gabrielanhaia/laravel-circuit-breaker

Laravel integration for PHP Circuit Breaker — multiple storage drivers, middleware, Artisan commands, and event system

481.0k](/packages/gabrielanhaia-laravel-circuit-breaker)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
