Пропустить контент
Купить

Обзор

Плагин 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: Автоматическая очистка истекших данных

Как работает кеширование

Процесс чтения

Процесс записи

  1. Попытка записи в основной драйвер
  2. При неудаче - последовательная попытка в fallback драйверах
  3. 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);

Оптимизация производительности

Рекомендации для продакшена

  1. Включите внешний объектный кеш

    php
    // wp-config.php
    define('WP_CACHE', true);
    // Настройте Redis/Memcached
  2. Используйте SQLite при отсутствии Redis

    • Убедитесь в наличии PDO_SQLITE
    • Проверьте права на запись
  3. Мониторьте размер кеша

    • Регулярно проверяйте виджет в админке
    • Запускайте 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 данных)
  • Резервное копирование критичных данных
  • Обновление настроек при изменении нагрузки

Рекомендация

Всегда проверяйте статус кеширования в виджете админки и настраивайте драйверы в зависимости от доступных ресурсов сервера для достижения оптимальной производительности.

WOO2IIKO © 2019 - 2026 Алексей Тихомиров.