cloud-castle / cache
Кэш для PHP 8.1+: PSR-16 (SimpleCache) и PSR-6 (CacheItemPool) из одного пакета, бэкенды в памяти и файловый с атомарной записью, инъектируемые часы PSR-20 для детерминированного TTL в тестах. Нулевые тяжёлые зависимости.
Requires
- php: >=8.1
- cloud-castle/clock: >=1.0
- cloud-castle/file-system: *
- psr/cache: ^3.0
- psr/simple-cache: ^3.0
Requires (Dev)
- deptrac/deptrac: ^3.0 || ^4.0
- ergebnis/composer-normalize: ^2.45
- friendsofphp/php-cs-fixer: ^3.75
- icanhazstring/composer-unused: ^0.9
- illuminate/cache: ^10.0
- infection/infection: ^0.29 || ^0.33
- matthiasmullie/scrapbook: ^1.5
- php-parallel-lint/php-parallel-lint: ^1.4
- phpfastcache/phpfastcache: ^9.2
- phpmd/phpmd: ^2.15
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^1.12 || ^2.1
- phpstan/phpstan-deprecation-rules: ^1.2 || ^2.0
- phpstan/phpstan-phpunit: ^1.4 || ^2.0
- phpstan/phpstan-strict-rules: ^1.6 || ^2.0
- phpunit/phpunit: ^10.5 || ^11.5
- psalm/plugin-phpunit: ^0.19 || ^0.20
- rector/rector: ^1.2 || ^2.0
- roave/security-advisories: dev-latest
- squizlabs/php_codesniffer: ^3.12 || ^4.0
- symfony/cache: ^6.4
- vimeo/psalm: ^6.0
- webmozart/assert: ^1.11
Provides
This package is auto-updated.
Last update: 2026-07-19 18:52:07 UTC
README
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
CloudCastle Cache
Кэш для PHP 8.1+ с PSR-16 (SimpleCache) и PSR-6 (CacheItemPool) из одного пакета: бэкенды «в памяти» и файловый (атомарная запись), инъектируемые часы (PSR-20) для детерминированного TTL в тестах. Нулевые тяжёлые зависимости.
Установка
composer require cloud-castle/cache
Требуется PHP 8.1+.
Быстрый старт
<?php
use CloudCastle\Cache\Cache;
// PSR-16 (SimpleCache) в памяти.
$cache = Cache::array();
$cache->set('user:42', $user, 3600); // на час
$user = $cache->get('user:42', $default); // значение или умолчание при промахе
// PSR-16 файловый кэш с атомарной записью (temp + rename).
$cache = Cache::file('/var/cache/app');
// PSR-6 (CacheItemPool) с отложенным сохранением.
$pool = Cache::filePool('/var/cache/app');
$item = $pool->getItem('report');
if (!$item->isHit()) {
$item->set($report)->expiresAfter(600);
$pool->save($item);
}
// Детерминированный TTL в тестах — подмените системные часы на mock/frozen.
$cache = Cache::array($mockClock);
Возможности
- PSR-16 (SimpleCache) и PSR-6 (CacheItemPool) из одного пакета над общим бэкендом.
- Бэкенды:
ArrayStore(в памяти) иFileStore(файлы с атомарной записью черезcloud-castle/file-system— никаких частично записанных файлов). - Инъектируемые часы (PSR-20): истечение TTL детерминировано в тестах —
«перематывайте» время
FrozenClock/MockClockбез реального ожидания. - Корректный
null: попадание в кэшnullотличается от промаха. - Валидация ключей по требованиям PSR (запрет символов
{}()/\@:). - Нулевые тяжёлые зависимости — только PSR-контракты и
cloud-castle/clock,cloud-castle/file-system.
Сравнение с аналогами
Все таблицы ниже сгенерированы автоматически из честных сравнительных
тестов (benchmarks/compare.php) на ОДИНАКОВОЙ операции для всех аналогов,
PHP 8.1.34, без Xdebug.
1. Функциональность
| Возможность | 🏆 CloudCastle | symfony | scrapbook | illuminate | phpfastcache | array¹ |
|---|---|---|---|---|---|---|
| PSR-16 (SimpleCache) из коробки | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| PSR-6 (CacheItemPool) из коробки | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
| Инъектируемые часы (PSR-20) — детерминированный TTL в тестах | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Атомарная файловая запись (без битых кэш-файлов) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Нулевые тяжёлые зависимости (только PSR + clock/file-system) | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ |
| Всего | 🏆 5 | 3 | 3 | 1 | 2 | 1 |
2. Безопасность и корректность
| Свойство | 🏆 CloudCastle | symfony | scrapbook | illuminate | phpfastcache | array¹ |
|---|---|---|---|---|---|---|
| Валидация ключей по PSR (запрет {}()/\@:) | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Корректное хранение null (отличается от промаха) | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Атомарная запись файлов (нет частичных данных) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Детерминированное истечение TTL (инъектируемые часы) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Устойчивость к битым кэш-файлам (промах вместо падения) | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
| Всего | 🏆 5 | 4 | 3 | 2 | 3 | 0 |
3. Производительность
set + get в кэше «в памяти», 200 000 раз (минимум из 4).
| Решение | Время (мс) | Итог |
|---|---|---|
| array¹ | 9 | базовый уровень (не библиотека) |
| 🏆 CloudCastle | 110,1 | быстрейшее среди библиотек |
| illuminate | 146,4 | аналог |
| scrapbook | 382,2 | аналог |
| symfony | 798,1 | аналог |
| phpfastcache | 1 096,8 | аналог |
4. Потребление памяти
Пик памяти на 200 000 операций (изолированный процесс, только целевая библиотека).
| Решение | Пиковая память (KB) | Итог |
|---|---|---|
| 🏆 CloudCastle | 7 024 | легчайшее среди библиотек |
| symfony | 7 024 | аналог |
| scrapbook | 7 024 | аналог |
| illuminate | 7 024 | аналог |
| array¹ | 7 024 | базовый уровень (не библиотека) |
| phpfastcache | 7 258 | аналог |
¹ Базовый уровень (нативные вызовы/примитивы без полноты решения) показан для контекста и не претендует на победу среди библиотек-аналогов.
Вывод: CloudCastle Cache — самый быстрый среди PSR-16 библиотек и самый лёгкий по памяти, единственный дающий PSR-16 + PSR-6 с инъектируемыми часами (тестируемый TTL) и атомарной файловой записью при нулевых тяжёлых зависимостях.
Разработка
composer install
composer check # линтеры + статический анализ + тесты
composer fix # автоисправления (Rector, PHP CS Fixer, PHPCBF)
composer ci # полный CI-пайплайн локально
Полный список команд с описаниями: composer run-script --list.
Документация
- Репозиторий: https://gitverse.ru/cloud-castle/cache
- История изменений: CHANGELOG.md
- Как внести вклад: CONTRIBUTING.md
- Кодекс поведения: CODE_OF_CONDUCT.md
- Политика безопасности: SECURITY.md
Лицензия
MIT © CloudCastle (alex-4-17@yandex.ru)
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano