Кеширование

Содержание...

Фреймворк Webasyst предоставляет интерфейс для кеширования данных несколькими способами: в оперативной памяти (runtime), в файлах, а также дополнительные средства кеширования с использованием PHP-библиотеки memcached или PHP-акселератора XCache.

Кеширование в оперативной памяти

Для кеширования данных в оперативной памяти сервера часто достаточно использовать статические переменные в коде программного продукта. Если же ваш продукт сложный или если вы хотите использовать центральзованный системный инструмент доступа к таким переменным, то для организации кеширования данных в памяти используйте класс waRuntimeCache. Каждый экземпляр этого класса соответствует отдельной переменной-ключу, имя которой нужно указать в виде строки в качестве параметра, передаваемого в конструктор класса, например:

//ключ кеша должен содержать ID приложения,
// которое его использует, во избежание конфликтов имен ключей
$orders_cache = new waRuntimeCache('myapp_orders');

Методы класса waRuntimeCache

  • get() — получить значение переменной-ключа;
  • set($value) — установить значение для переменной-ключа;
  • delete() — удаление переменной-ключа;
  • isCached() — существует ли указанная переменная-ключ.

Файловое кеширование

Для хранения кешированных данных в файлах следует сохранять эти данные в директорию wa-cache/apps/[app_id]/, не допуская конфликтов доступа к файлам кеша между различными плагинами и приложениями.

Для удобства доступа к файлам кеша используйте PHP-классы waSerializeCache и waVarExportCache. Каждый экземпляр этих классов соответствует отдельному кеш-файлу. Разница между этими классами состоит в формате хранения данных:

waSerializeCache: результат выполнения функции serialize()
waVarExportCache: результат выполнения функции var_export()

Конструкторы этих классов принимают следующие параметры:

  • $key — имя кеш-файла без расширения .php
  • $ttl — необязательное целочисленное значение времени жизни кеша в секундах; по умолчанию = -1 (с таким значением по умолчанию кеш-файл всегда считается валидным)
  • $app_id — идентификатор приложения, к которому относится кеш-файл; если не указан, используется идентификатор текущего приложения, в коде которого используется класс

Методы классов waSerializeCache и waVarExportCache

Методы этих классов аналогичны метода класса waRuntimeCache, однако оперируют файлами вместо переменных-ключей.
  • get() — получить кешированное значение; валидность кеш-файла проверяется с путем сравнения разности текущей метки времени и метки времени сохранения файла и значения времени жизни кеша ('ttl');
  • set($value) — записать данные в кеш-файл вместе со значением периода валидности кеша и текущей метки времени;
  • delete() — удалить кеш-файл;
  • isCached() — валиден ли кеш, хранящийся в файле.

Дополнительные средства кеширования

Для включения поддержки кеширования с помощью memcached или XCache необходимо создать конфигурационный файл wa-config/cache.php, как показано в примере:

<?php
return [
    'default' => [    //используйте ключ 'default' для того средства кеширования, которое должно использоваться по умолчанию
        'type' => 'memcached',    //обязательное указание типа адаптера кеша в нижнем регистре: 'memcached' или 'xcache'
        'namespace' => '...',   //произвольный идентификатор для устранения конфликтов кеша между несколькими сайтами на одном сервере при использовании memcached
        'prefix' => '...',   //произвольный идентификатор для устранения конфликтов кеша между несколькими сайтами на одном сервере при использовании XCache
        'servers' => [    //список серверов memcached
            [
                'host' => '',
                'port' => '',    //необязательный параметр, по умолчанию используется значение 11211
                'weight' => '',    //необязательный параметр, по умолчанию используется значение 0
            ],
            [
                ...
            ],
        ],
    ],
    'alternative' => [    //если нужна поддержка альтернативных способов кеширования, их параметры конфигурации добавляется с другими (произвольными) ключами
        'type' => 'xcache',    //кеширование с помощью акселератора XCache
        'prefix' => ...    //префикс XCache
    ],
    'alternative2' => [
        'type' => 'file',    //файловое кеширование с использованием директории, отличной от используемой фреймворком по умолчанию
        'path' => '...',    //путь к директории для хранения к файлам кеша; отличный от стандартного пути wa-cache/apps/
    ],
];

Использование дополнительных средств кеширования

Для получения доступа к механизму кеширования необходимо использовать экземпляр класса waCache с помощью метода wa('[app_id]')->getCache(), где для функции wa() стоит всегда указывать идентификатор приложения, к кешу которого необходимо обеспечить доступ, чтобы не полагаться на автоматическое определение текущего приложения и не допускать неопределенного поведения программы.

Если файл wa-config/cache.php отсутствует, то по умолчанию дополнительное кеширование не используется.

Если файл wa-config/cache.php создан, то при вызове метода wa('[app_id]')->getCache() по умолчанию возвращается экземпляр класса, соответствующий адаптеру кеширования, идентификатор которого указан в секции 'default' конфигурационного файла. В этом примере в качестве адаптера кеширования по умолчанию будет использоваться класс, использующий расширение memcached.

Стоит всегда проверять значение, возвращаемое методом wa('[app_id]')->getCache(). Если метод возвращает нулевое значение, дальнейшие попытки использовать методы кеширования будут бессмысленны.

Когда это необходимо в коде вашего приложения, в качестве параметра при вызове метода wa('[app_id]')->getCache() укажите ключ конфигурации другого (неосновного) адаптера кеша, чтобы использовать его вместо адаптера по умолчанию, например:

wa('[app_id]')->getCache('alternative')

Методы класса waCache

  • set($key, $value, $expiration = null, $group = null) — сохранение кешированного значения
    • $key — ключ кешированного значения
    • $value — данные, которые нужно сохранить в кеше
    • $expiration — неотрицательное целочисленное значение периода времени в секундах, в течение которого кешированное значение должно считаться действительным (валидным); если значение указанного формата отсутствует, то записываемое в кеш значение считается валидным вне зависимости от периода времени, прошедшего с момента его записи
    • $group — необязательный идентификатор группы, в которой должно храниться кешированное значение
  • get($key, $group = null) — чтение кешированного значения
  • delete($key, $group = null) — удаление кешированного значения
  • deleteGroup($group) — удаление группы кешированных значений
  • deleteAll() — удаление всего (дополнительного) кеша данного приложения