TigerZF
🌐Español

17.5. El gestor de caché

Es propio de las aplicaciones requerir multitud de cachés de cualquier tipo, a menudo dependiendo del controlador, la librería o el modelo de dominio al que se accede. Para permitir un medio sencillo de definir por adelantado las opciones de Zend_Cache (por ejemplo, desde un bootstrap), de modo que acceder a un objeto de caché requiera una configuración mínima dentro del código fuente de la aplicación, se escribió la clase Zend_Cache_Manager. Esta clase va acompañada de Zend_Application_Resource_Cachemanager para garantizar que la configuración de arranque esté disponible, y de Zend_Controller_Action_Helper_Cache para permitir un acceso e instanciación sencillos de la caché desde controladores y otros ayudantes (helpers).

El funcionamiento básico de este componente es el siguiente. El gestor de caché permite a los usuarios configurar "plantillas de opciones", básicamente opciones para un conjunto de cachés con nombre. Estas se pueden establecer usando el método Zend_Cache_Manager::setCacheTemplate(). Estas plantillas no dan lugar a una caché hasta que el usuario intenta recuperar una caché con nombre (asociada a una plantilla de opciones existente) usando el método Zend_Cache_Manager::getCache().

$manager = new Zend_Cache_Manager;

$dbCache = array(
    'frontend' => array(
        'name' => 'Core',
        'options' => array(
            'lifetime' => 7200,
            'automatic_serialization' => true
        )
    ),
    'backend' => array(
        'name' => 'Core',
        'options' => array(
            'cache_dir' => '/path/to/cache'
        )
    )
);

$manager->setCacheTemplate('database', $dbCache);

/**
 * Anywhere else where the Cache Manager is available...
 */
$databaseCache = $manager->getCache('database');

El gestor de caché también permite establecer de forma sencilla cachés ya instanciadas usando el método Zend_Cache_Manager::setCache().

$frontendOptions = array(
   'lifetime' => 7200,
   'automatic_serialization' => true
);

$backendOptions = array(
    'cache_dir' => '/path/to/cache'
);

$dbCache = Zend_Cache::factory('Core',
                             'File',
                             $frontendOptions,
                             $backendOptions);

$manager = new Zend_Cache_Manager;
$manager->setCache('database', $dbCache);

/**
 * Anywhere else where the Cache Manager is available...
 */
$databaseCache = $manager->getCache('database');

Si por cualquier razón no está seguro de si el gestor de caché contiene una caché ya instanciada o una plantilla de opciones relevante para crear una cuando se solicite, puede comprobar la existencia de una configuración o instancia de caché con nombre usando el método Zend_Cache_Manager::hasCache().

$manager = new Zend_Cache_Manager;

$dbCache = array(
    'frontend' => array(
        'name' => 'Core',
        'options' => array(
            'lifetime' => 7200,
            'automatic_serialization' => true
        )
    ),
    'backend' => array(
        'name' => 'Core',
        'options' => array(
            'cache_dir' => '/path/to/cache'
        )
    )
);

$manager->setCacheTemplate('database', $dbCache);

/**
 * Anywhere else where the Cache Manager is available...
 */
if ($manager->hasCache('database')) {
    $databaseCache = $manager->getCache('database');
} else {
    // create a cache from scratch if none available from Manager
}

En algunos escenarios, puede que haya definido varias cachés de uso general usando Zend_Cache_Manager, pero necesite ajustar sus opciones antes de usarlas dependiendo de las circunstancias. Puede editar plantillas de caché previamente establecidas sobre la marcha antes de que se instancien usando el método Zend_Cache_Manager::setTemplateOptions().

$manager = new Zend_Cache_Manager;

$dbCache = array(
    'frontend' => array(
        'name' => 'Core',
        'options' => array(
            'lifetime' => 7200,
            'automatic_serialization' => true
        )
    ),
    'backend' => array(
        'name' => 'Core',
        'options' => array(
            'cache_dir' => '/path/to/cache'
        )
    )
);

$manager->setCacheTemplate('database', $dbCache);

/**
 * Anywhere else where the Cache Manager is available...
 * Here we decided to store some upcoming database queries to Memcached instead
 * of the preconfigured File backend.
 */
$fineTuning = array(
    'backend' => array(
        'name' => 'Memcached',
        'options' => array(
            'servers' => array(
                array(
                    'host' => 'localhost',
                    'port' => 11211,
                    'persistent' => true,
                    'weight' => 1,
                    'timeout' => 5,
                    'retry_interval' => 15,
                    'status' => true,
                    'failure_callback' => ''
                )
            )
        )
    )
);
$manager->setTemplateOptions('database', $fineTuning);
$databaseCache = $manager->getCache('database');

Para ayudar a que el gestor de caché sea más útil, va acompañado de Zend_Application_Resource_Cachemanager y también del ayudante de acción (Action Helper) Zend_Controller_Action_Helper_Cache. Ambos se describen en sus áreas relevantes de la Guía de referencia.

Ya de fábrica, Zend_Cache_Manager incluye tres plantillas de caché predefinidas llamadas "default", "page" y "pagetag". La caché "default" es una caché sencilla basada en archivos (File) que usa el frontend Core. Las dos cachés restantes se utilizan para implementar una caché de páginas estáticas (Static Page Cache) por defecto en la que HTML, XML o incluso JSON estáticos pueden escribirse en archivos estáticos en /public. El control sobre una caché de páginas estáticas se ofrece a través de Zend_Controller_Action_Helper_Cache, aunque puede alterar la configuración de la caché "page" o "pagetag" que utiliza para rastrear etiquetas mediante Zend_Cache_Manager::setTemplateOptions() o incluso Zend_Cache_Manager::setCacheTemplate() si desea sobrescribir todas sus opciones.