Обзор
Плагин Woo2iiko использует многоуровневую систему кеширования для оптимизации производительности и снижения нагрузки на API iiko. Система обеспечивает быструю работу как в средах с внешним объектным кешем (Redis/Memcached), так и без него.
Архитектура кеширования
Основные компоненты
- TransientCache: Универсальный персистентный кеш для хранения данных между HTTP-запросами
- ApiTransientCache: Специализированный слой для кеширования ответов iiko API
- CacheStorageFactory: Фабрика драйверов кеширования с автоматическим выбором оптимального
- Fallback-механизм: Автоматическое переключение на альтернативные хранилища при сбоях
Драйверы хранения
ObjectCacheStorage
- Бэкенд: Redis/Memcached через
wp_cache_* - Активация: При
wp_using_ext_object_cache() === true - Преимущества: Максимальная производительность, распределенное хранение
- Ограничения: Размер элементов (обычно 1MB в Memcached)
SqliteStorage
- Бэкенд: SQLite база данных
- Активация: При наличии
PDO_SQLITEи отсутствии внешнего кеша - Преимущества: Быстрое персистентное хранение, поддержка больших данных
- Файл:
/wp-content/uploads/iiko-cache/cache.db
FileStorage
- Бэкенд: Файловая система с JSON-метаданными
- Активация: По умолчанию, когда другие недоступны
- Преимущества: Простота, надежность
- Расположение:
/wp-content/uploads/iiko-cache/ - GC: Автоматическая очистка истекших данных
Как работает кеширование
Процесс чтения
Процесс записи
- Попытка записи в основной драйвер
- При неудаче - последовательная попытка в fallback драйверах
- TTL поддержка - время жизни данных в каждом драйвере
Fallback механизм
- Автоматическое переключение при сбоях основного драйвера
- Иерархия: ObjectCache → Sqlite → File
- Большие данные: Автоматический выбор драйвера для данных >5MB
Типы кешируемых данных
API данные
- Nomenclature: Каталог товаров и модификаторов
- Organizations: Список организаций
- Cities: Города доставки
- PaymentTypes: Типы оплаты
- StopList: Стоп-листы товаров
- Discounts: Скидки и акции
- DeliveryRestrictions: Ограничения доставки
Системные данные
- Terminal: Терминалы доставки
- OrderTypes: Типы заказов
- LoyaltyPrograms: Программы лояльности
- RestaurantSections: Секции ресторана
Настройки кеширования
Время жизни данных
php
// Константы времени
ApiTransientCache::MINUTE_IN_SECONDS // 60
ApiTransientCache::HOUR_IN_SECONDS // 3600
ApiTransientCache::DAY_IN_SECONDS // 86400
ApiTransientCache::WEEK_IN_SECONDS // 604800
ApiTransientCache::MONTH_IN_SECONDS // 2592000Рекомендуемые TTL
- Nomenclature: 15-30 минут
- Organizations: 1 час
- Cities: 1 день
- StopList: 5-15 минут
- PaymentTypes: 1 час
Управление через админку
В виджете Cache status (woo2iiko):
- Статус бэкенда: Текущий драйвер кеширования
- Размер кеша: Объем данных в файловом хранилище
- Рекомендации: Предложения по оптимизации
- Быстрые действия: Очистка кеша, запуск GC
Мониторинг производительности
Метрики кеширования
php
// Получение статистики
$cache = Cache::getInstance();
$hitRate = $cache->getHitRate('total');
// Логирование в отладке
console_log('Cache hit rate: ' . $hitRate);Индикаторы эффективности
- Hit Rate: Процент попаданий в кеш (>90% оптимально)
- Размер кеша: Не более 200MB для файлового хранилища
- Время ответа: Ускорение API запросов в 10-100 раз
Логирование операций
Все операции с кешем логируются:
- Запись данных
- Чтение из кеша
- Очистка кеша
- Переключение драйверов
Использование в коде
Базовые операции с TransientCache
php
use iiko\cache\TransientCache;
$cache = TransientCache::getInstance();
// Запись в кеш
$cache->set('my_key', $data, 3600); // 1 час
// Чтение из кеша
$data = $cache->get('my_key');
// Удаление из кеша
$cache->delete('my_key');
// Очистка всего кеша
$cache->clear_all();Работа с ApiTransientCache
php
use iiko\cache\ApiTransientCache;
$apiCache = ApiTransientCache::getInstance();
// Получение данных (автоматическое кеширование)
$nomenclature = $apiCache->Nomenclature;
// Явная установка
$apiCache->set('CustomData', $value, 1800);
// Получение с метаданными времени
$record = $apiCache->get_with_time('Nomenclature');
// ['value' => $data, 'time' => timestamp]
// Удаление
unset($apiCache->Nomenclature);Проверка состояния кеширования
php
// Проверка внешнего кеша
$usingExternal = TransientCache::ext_cache_using();
// Получение текущего драйвера
$cache = TransientCache::getInstance();
$driver = get_class($cache->storage);Оптимизация производительности
Рекомендации для продакшена
Включите внешний объектный кеш
php// wp-config.php define('WP_CACHE', true); // Настройте Redis/MemcachedИспользуйте SQLite при отсутствии Redis
- Убедитесь в наличии
PDO_SQLITE - Проверьте права на запись
- Убедитесь в наличии
Мониторьте размер кеша
- Регулярно проверяйте виджет в админке
- Запускайте GC при >200MB
Настройка TTL
php
// Оптимальные настройки
add_filter('iiko_cache_ttl_nomenclature', function() {
return 30 * MINUTE_IN_SECONDS; // 30 минут
});
add_filter('iiko_cache_ttl_stoplist', function() {
return 10 * MINUTE_IN_SECONDS; // 10 минут
});Устранение неполадок
Проблема: Данные не кешируются
Решения:
- Проверьте права на запись в
/wp-content/uploads/ - Убедитесь в доступности выбранного драйвера
- Проверьте логи на ошибки
Проблема: 429 Too Many Requests
Решения:
- Проверьте актуальность кеша номенклатуры
- Убедитесь, что данные сохраняются после первого запроса
- Проверьте TTL настройки
Проблема: Большой размер кеша
Решения:
- Очистите кеш через админку
- Уменьшите TTL для редко используемых данных
- Запустите GC для файлового хранилища
Проблема: Медленная работа
Решения:
- Включите внешний объектный кеш
- Проверьте производительность диска для SQLite
- Оптимизируйте TTL настройки
API для разработчиков
Кастомные драйверы кеширования
php
class CustomStorage implements CacheStorageInterface {
public function get(string $key) {
// Логика чтения
}
public function set(string $key, $value, int $ttl = 0): bool {
// Логика записи
}
public function delete(string $key): bool {
// Логика удаления
}
}Хуки для расширения
php
// Хук перед записью в кеш
do_action('iiko_cache_before_set', $key, $value, $ttl);
// Хук после чтения из кеша
do_action('iiko_cache_after_get', $key, $value);
// Фильтр TTL
do_action('iiko_cache_ttl_nomenclature', $ttl);
// Кастомный драйвер
add_filter('iiko_cache_storage_factory', function($storage) {
return new CustomStorage();
});Отладка кеширования
php
// Включение отладки
add_filter('iiko_cache_debug', '__return_true');
// Логирование всех операций
add_action('iiko_cache_before_set', function($key, $value) {
console_log("Cache set: $key", 'debug');
});Тестирование
Автоматизированные тесты
Плагин включает тесты для:
- Базовых операций get/set/delete
- Хранения больших значений (>6MB)
- Доступа к данным между запросами
- Отсутствия повторных сетевых вызовов
Ручное тестирование
php
// Очистка кеша для тестирования
$cache = TransientCache::getInstance();
$cache->clear_all();
// Проверка hit rate
add_action('shutdown', function() {
$cache = Cache::getInstance();
console_log('Final hit rate: ' . $cache->getHitRate());
});Миграция и обновления
Обновление драйверов
- Автоматическое обнаружение оптимального драйвера
- Сохранение данных при переключении между драйверами
- Fallback при недоступности основного драйвера
Очистка устаревших данных
- GC для файлового кеша: Автоматическая очистка истекших файлов
- Валидация данных: Проверка актуальности при чтении
- Ручная очистка: Через админ-интерфейс
Лучшие практики
Настройка для разных сред
Разработка:
- Используйте файловое хранилище
- Включите подробное логирование
- Короткие TTL для быстрого обновления
Продакшен:
- Redis/Memcached для максимальной производительности
- Оптимальные TTL для снижения нагрузки на API
- Мониторинг hit rate и размера кеша
Testing:
- Полная очистка кеша перед тестами
- Проверка работы всех драйверов
- Валидация данных после кеширования
Мониторинг и обслуживание
- Еженедельная проверка виджета в админке
- Мониторинг hit rate (>90% для API данных)
- Резервное копирование критичных данных
- Обновление настроек при изменении нагрузки
Рекомендация
Всегда проверяйте статус кеширования в виджете админки и настраивайте драйверы в зависимости от доступных ресурсов сервера для достижения оптимальной производительности.