Spec-Zone.ru › Phalcon 2

Улучшение производительности с кэшем

Phalcon предоставляет класс Phalcon\Cache, позволяющий быстрее получать доступ к часто используемым или уже обработанным данным. Phalcon\Cache написан на C, что обеспечивает более высокую производительность и снижает нагрузку при получении элементов из кэша. Этот класс использует внутреннюю структуру из компонентов front-end и back-end. Компоненты front-end служат источниками или интерфейсами ввода, а компоненты back-end предлагают варианты хранения для класса.

Когда следует использовать кэш?

Хотя этот компонент очень быстрый, его применение в случаях, когда он не нужен, может привести к снижению, а не повышению производительности. Мы рекомендуем проверить эти случаи перед использованием кэша:

  • Вы выполняете сложные вычисления, которые каждый раз возвращают один и тот же результат (редко меняющийся)
  • Вы используете много вспомогательных функций, и генерируемый вывод практически всегда одинаковый
  • Вы постоянно обращаетесь к данным базы данных, и эти данные редко меняются
ПРИМЕЧАНИЕ Даже после внедрения кэша следует проверять коэффициент попадания в кэш в течение определенного периода времени. Это легко сделать, особенно в случае Memcache или Apc, с помощью соответствующих инструментов, которые предоставляют back-end компоненты.

Поведение кэша

Процесс кэширования разделен на 2 части:

  • Front-end: Эта часть отвечает за проверку истечения срока действия ключа и выполнение дополнительных преобразований данных перед сохранением и после извлечения их из back-end компонента.
  • Back-end: Эта часть отвечает за общение, запись/чтение данных, необходимых front-end компоненту.

Кэширование фрагментов вывода

Фрагмент вывода — это фрагмент HTML или текста, который кэшируется как есть и возвращается как есть. Вывод автоматически захватывается из функций ob_* или PHP-вывода, чтобы его можно было сохранить в кэше. Следующий пример демонстрирует такое использование. Он получает вывод, сгенерированный PHP, и сохраняет его в файл. Содержимое файла обновляется каждые 172800 секунд (2 дня).

Реализация этого механизма кэширования позволяет повысить производительность, не вызывая вызов вспомогательной функции Phalcon\Tag::linkTo всякий раз, когда этот фрагмент кода вызывается.

//Create an Output frontend. Cache the files for 2 days
$frontCache = new Phalcon\Cache\Frontend\Output(array(
    "lifetime" => 172800
));

// Create the component that will cache from the "Output" to a "File" backend
// Set the cache file directory - it's important to keep the "/" at the end of
// the value for the folder
$cache = new Phalcon\Cache\Backend\File($frontCache, array(
    "cacheDir" => "../app/cache/"
));

// Get/Set the cache file to ../app/cache/my-cache.html
$content = $cache->start("my-cache.html");

// If $content is null then the content will be generated for the cache
if ($content === null) {

    //Print date and time
    echo date("r");

    //Generate a link to the sign-up action
    echo Phalcon\Tag::linkTo(
        array(
            "user/signup",
            "Sign Up",
            "class" => "signup-button"
        )
    );

    // Store the output into the cache file
    $cache->save();

} else {

    // Echo the cached output
    echo $content;
}

ПРИМЕЧАНИЕ В приведенном выше примере наш код остается прежним, отображая вывод пользователю, как и раньше. Наш компонент кэширования прозрачно захватывает этот вывод и сохраняет его в файле кэша (при генерации кэша) или возвращает его пользователю в предварительно скомпилированном виде из предыдущего вызова, тем самым избегая дорогостоящих операций.

Кэширование произвольных данных

Кэширование просто данных так же важно для вашей программы. Кэширование может уменьшить нагрузку на базу данных, повторно используя часто используемые (но не обновляемые) данные, тем самым ускоряя вашу программу.

Пример back-end компонента «Файл»

Один из адаптеров кэширования — «Файл». Единственной ключевой областью для этого адаптера является расположение, где будут храниться файлы кэша. Это контролируется параметром cacheDir, который *обязательно* должен заканчиваться обратной косой чертой.

// Cache the files for 2 days using a Data frontend
$frontCache = new Phalcon\Cache\Frontend\Data(array(
    "lifetime" => 172800
));

// Create the component that will cache "Data" to a "File" backend
// Set the cache file directory - important to keep the "/" at the end of
// of the value for the folder
$cache = new Phalcon\Cache\Backend\File($frontCache, array(
    "cacheDir" => "../app/cache/"
));

// Try to get cached records
$cacheKey = 'robots_order_id.cache';
$robots    = $cache->get($cacheKey);
if ($robots === null) {

    // $robots is null because of cache expiration or data does not exist
    // Make the database call and populate the variable
    $robots = Robots::find(array("order" => "id"));

    // Store it in the cache
    $cache->save($cacheKey, $robots);
}

// Use $robots :)
foreach ($robots as $robot) {
   echo $robot->name, "\n";
}

Пример back-end компонента «Memcached»

Приведенный выше пример несколько меняется (особенно в плане конфигурации), когда мы используем back-end компонент «Memcached».

//Cache data for one hour
$frontCache = new Phalcon\Cache\Frontend\Data(array(
    "lifetime" => 3600
));

// Create the component that will cache "Data" to a "Memcached" backend
// Memcached connection settings
$cache = new Phalcon\Cache\Backend\Libmemcached($frontCache, array(
    "host" => "localhost",
    "port" => "11211"
));

// Try to get cached records
$cacheKey = 'robots_order_id.cache';
$robots    = $cache->get($cacheKey);
if ($robots === null) {

    // $robots is null because of cache expiration or data does not exist
    // Make the database call and populate the variable
    $robots = Robots::find(array("order" => "id"));

    // Store it in the cache
    $cache->save($cacheKey, $robots);
}

// Use $robots :)
foreach ($robots as $robot) {
   echo $robot->name, "\n";
}

Запрос к кэшу

Элементы, добавленные в кэш, однозначно идентифицируются по ключу. В случае back-end компонента «Файл» ключ — это фактическое имя файла. Чтобы извлечь данные из кэша, достаточно вызвать его с использованием уникального ключа. Если ключ не существует, метод get вернёт null.

// Retrieve products by key "myProducts"
$products = $cache->get("myProducts");

Если вы хотите узнать, какие ключи хранятся в кэше, вы можете вызвать метод queryKeys:

// Query all keys used in the cache
$keys = $cache->queryKeys();
foreach ($keys as $key) {
    $data = $cache->get($key);
    echo "Key=", $key, " Data=", $data;
}

//Query keys in the cache that begins with "my-prefix"
$keys = $cache->queryKeys("my-prefix");

Удаление данных из кэша

Иногда вам необходимо принудительно аннулировать запись в кэше (из-за обновления кэшированных данных). Единственное требование — знать ключ, с которым данные были сохранены.

// Delete an item with a specific key
$cache->delete("someKey");

// Delete all items from the cache
$keys = $cache->queryKeys();
foreach ($keys as $key) {
    $cache->delete($key);
}

Проверка существования кэша

Можно проверить, существует ли кэш с заданным ключом:

if ($cache->exists("someKey")) {
    echo $cache->get("someKey");
} else {
    echo "Cache does not exists!";
}

Срок жизни

«Срок жизни» — это время в секундах, в течение которого кэш может существовать без истечения срока действия. По умолчанию все созданные кэши используют срок действия, установленный при создании front-end компонента. Вы можете установить определенный срок действия при создании или получении данных из кэша:

Установление срока действия при получении:

$cacheKey = 'my.cache';

//Setting the cache when getting a result
$robots = $cache->get($cacheKey, 3600);
if ($robots === null) {

    $robots = "some robots";

    // Store it in the cache
    $cache->save($cacheKey, $robots);
}

Установление срока действия при сохранении:

$cacheKey = 'my.cache';

$robots = $cache->get($cacheKey);
if ($robots === null) {

    $robots = "some robots";

    //Setting the cache when saving data
    $cache->save($cacheKey, $robots, 3600);
}

Многоуровневый кэш

Эта функция компонента кэширования позволяет разработчику реализовать многоуровневый кэш. Эта новая функция очень полезна, потому что вы можете сохранить одни и те же данные в нескольких местах кэширования с разными сроками действия, сначала читая из места с более быстрым адаптером и заканчивая самым медленным, пока данные не истекут:

use Phalcon\Cache\Frontend\Data as DataFrontend,
    Phalcon\Cache\Multiple,
    Phalcon\Cache\Backend\Apc as ApcCache,
    Phalcon\Cache\Backend\Memcache as MemcacheCache,
    Phalcon\Cache\Backend\File as FileCache;

$ultraFastFrontend = new DataFrontend(array(
    "lifetime" => 3600
));

$fastFrontend = new DataFrontend(array(
    "lifetime" => 86400
));

$slowFrontend = new DataFrontend(array(
    "lifetime" => 604800
));

//Backends are registered from the fastest to the slower
$cache = new Multiple(array(
    new ApcCache($ultraFastFrontend, array(
        "prefix" => 'cache',
    )),
    new MemcacheCache($fastFrontend, array(
        "prefix" => 'cache',
        "host" => "localhost",
        "port" => "11211"
    )),
    new FileCache($slowFrontend, array(
        "prefix" => 'cache',
        "cacheDir" => "../app/cache/"
    ))
));

//Save, saves in every backend
$cache->save('my-key', $data);

Адаптеры front-end

Доступные адаптеры front-end, используемые как интерфейсы или источники ввода для кэширования:

Адаптер Описание Пример
Вывод Чтение входных данных из стандартного PHP-вывода Phalcon\Cache\Frontend\Output
Данные Используется для кэширования любых данных PHP (больших массивов, объектов, текста и т. д.). Данные сериализуются перед сохранением в back-end компоненте. Phalcon\Cache\Frontend\Data
Base64 Используется для кэширования двоичных данных. Данные сериализуются с помощью base64_encode перед сохранением в back-end компоненте. Phalcon\Cache\Frontend\Base64
Json Данные кодируются в JSON перед сохранением в back-end компоненте. Декодируются после извлечения. Этот front-end компонент полезен для обмена данными с другими языками или фреймворками. Phalcon\Cache\Frontend\Json
IgBinary Используется для кэширования любых данных PHP (больших массивов, объектов, текста и т. д.). Данные сериализуются с помощью IgBinary перед сохранением в back-end компоненте. Phalcon\Cache\Frontend\Igbinary
Без Используется для кэширования любых данных PHP без их сериализации. Phalcon\Cache\Frontend\None

Реализация собственных адаптеров front-end

Для создания собственных адаптеров front-end или расширения существующих необходимо реализовать интерфейс Phalcon\Cache\FrontendInterface.

Адаптеры back-end

Доступные адаптеры back-end для хранения данных кэша:

Адаптер Описание Информация Необходимые расширения Пример
Файл Хранит данные в локальных текстовых файлах Phalcon\Cache\Backend\File
Memcached Хранит данные на сервере memcached Memcached memcache Phalcon\Cache\Backend\Memcache
APC Хранит данные в кэше Alternative PHP Cache (APC) APC Расширение APC Phalcon\Cache\Backend\Apc
Mongo Хранит данные в базе данных Mongo MongoDb Mongo Phalcon\Cache\Backend\Mongo
XCache Хранит данные в XCache XCache Расширение xcache Phalcon\Cache\Backend\Xcache

Реализация собственных адаптеров back-end

Для создания собственных адаптеров back-end или расширения существующих необходимо реализовать интерфейс Phalcon\Cache\BackendInterface.

Параметры back-end компонента «Файл»

Этот back-end компонент будет сохранять кэшируемое содержимое в файлы на локальном сервере. Доступные параметры для этого back-end компонента:

Параметр Описание
prefix Префикс, автоматически добавляемый к ключам кэша
cacheDir Каталог для записи, в котором будут храниться файлы кэша

Параметры back-end компонента «Memcached»

Этот back-end компонент будет сохранять кэшируемое содержимое на сервере memcached. Доступные параметры для этого back-end компонента:

Параметр Описание
prefix Префикс, автоматически добавляемый к ключам кэша
host Хост memcached
port Порт memcached
persistent Создать постоянное соединение с memcached?

Параметры бэкенда APC

Этот бэкенд будет хранить кэшированные данные в кэше Alternative PHP Cache (APC). Доступные параметры для этого бэкенда:

Параметр Описание
prefix Префикс, который автоматически добавляется к ключам кэша

Параметры бэкенда Mongo

Этот бэкенд будет хранить кэшированные данные на сервере MongoDB. Доступные параметры для этого бэкенда:

Параметр Описание
prefix Префикс, который автоматически добавляется к ключам кэша
server Строка подключения к MongoDB
db Имя базы данных Mongo
collection Имя коллекции в базе данных

Параметры бэкенда XCache

Этот бэкенд будет хранить кэшированные данные в XCache (XCache). Доступные параметры для этого бэкенда:

Параметр Описание
prefix Префикс, который автоматически добавляется к ключам кэша

В инкубаторе Phalcon доступно больше адаптеров для этой компоненты: Phalcon Incubator

© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/cache.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API