Zend_Cache_Core es un frontend especial porque es el núcleo
del módulo. Es un frontend de caché genérico y es extendido por otras clases.
![]() |
Nota |
|---|---|
Todos los frontends heredan de |
Estas opciones se pasan al método factory tal como se demostró en ejemplos anteriores.
Tabla 17.1. Opciones del frontend Core
| Opción | Tipo de dato | Valor por defecto | Descripción |
|---|---|---|---|
| caching | Boolean | TRUE |
habilita / deshabilita la caché (puede ser muy útil para la depuración de scripts en caché) |
| cache_id_prefix | String | NULL |
Un prefijo para todos los ids de caché; si se establece en NULL,
no se usará ningún prefijo de id de caché. El prefijo de id de caché esencialmente
crea un espacio de nombres en la caché, permitiendo que múltiples aplicaciones
o sitios web usen una caché compartida. Cada aplicación o sitio web puede
usar un prefijo de id de caché distinto para que ciertos ids de caché puedan
usarse más de una vez.
|
| lifetime | Integer | 3600 |
tiempo de vida de la caché (en segundos); si se establece en NULL,
la caché es válida para siempre.
|
| logging | Boolean | FALSE |
si se establece en TRUE, se activa el registro
mediante Zend_Log
(pero el sistema es más lento)
|
| write_control | Boolean | TRUE |
Habilita / deshabilita el control de escritura (la caché se lee justo después de escribir para detectar entradas corruptas); habilitar write_control ralentizará ligeramente la escritura de la caché pero no la lectura de la caché (puede detectar algunos archivos de caché corruptos, pero no es un control perfecto) |
| automatic_serialization | Boolean | FALSE |
Habilita / deshabilita la serialización automática, puede usarse para guardar directamente datos que no son cadenas (pero es más lento) |
| automatic_cleaning_factor | Integer | 10 | Deshabilita / Ajusta el proceso de limpieza automática (recolector de basura): 0 significa sin limpieza automática de la caché, 1 significa limpieza sistemática de la caché y x > 1 significa limpieza automática aleatoria 1 vez de cada x operaciones de escritura. |
| ignore_user_abort | Boolean | FALSE |
si se establece en TRUE, el núcleo establecerá el
indicador ignore_user_abort de PHP dentro del
método save() para evitar corrupciones de
caché en algunos casos
|
Se da un ejemplo en el manual al principio.
Si solo se almacenan cadenas en caché (porque con la opción "automatic_serialization", es posible almacenar algunos booleanos), se puede usar una construcción más compacta como:
// we assume you already have $cache
$id = 'myBigLoop'; // cache id of "what we want to cache"
if ( ($data = $cache->load($id)) === false ) {
// cache miss
$data = '';
for ($i = 0; $i < 10000; $i++) {
$data = $data . $i;
}
$cache->save($data);
}
// [...] do something with $data (echo it, pass it on etc.)
Si desea cachear múltiples bloques o instancias de datos, la idea es la misma:
// make sure you use unique identifiers:
$id1 = 'foo';
$id2 = 'bar';
// block 1
if ( ($data = $cache->load($id1)) === false ) {
// cache missed
$data = '';
for ($i=0;$i<10000;$i++) {
$data = $data . $i;
}
$cache->save($data);
}
echo($data);
// this isn't affected by caching
echo('NEVER CACHED! ');
// block 2
if ( ($data = $cache->load($id2)) === false ) {
// cache missed
$data = '';
for ($i=0;$i<10000;$i++) {
$data = $data . '!';
}
$cache->save($data);
}
echo($data);
Si desea cachear valores especiales (booleanos con la opción "automatic_serialization") o cadenas vacías, no puede usar la construcción compacta anterior. Debe probar formalmente el registro de caché.
// the compact construction
// (not good if you cache empty strings and/or booleans)
if ( ($data = $cache->load($id)) === false ) {
// cache missed
// [...] we make $data
$cache->save($data);
}
// we do something with $data
// [...]
// the complete construction (works in any case)
if (!($cache->test($id))) {
// cache missed
// [...] we make $data
$cache->save($data);
} else {
// cache hit
$data = $cache->load($id);
}
// we do something with $data
Zend_Cache_Frontend_Output es un frontend de captura de salida.
Utiliza el almacenamiento en búfer de salida en PHP para capturar todo
lo que hay entre sus métodos start() y end().
Este frontend no tiene ninguna opción específica aparte de las de
Zend_Cache_Core.
Se da un ejemplo en el manual al principio. Aquí está con cambios menores:
// if it is a cache miss, output buffering is triggered
if (!($cache->start('mypage'))) {
// output everything as usual
echo 'Hello world! ';
echo 'This is cached ('.time().') ';
$cache->end(); // output buffering ends
}
echo 'This is never cached ('.time().').';
Usando esta forma es bastante fácil establecer el caché de salida en un proyecto que ya está funcionando con poca o ninguna refactorización de código.
Zend_Cache_Frontend_Function cachea los resultados de las
llamadas a funciones. Tiene un único método principal llamado call()
que toma un nombre de función y los parámetros para la llamada en un array.
Tabla 17.2. Opciones del frontend Function
| Opción | Tipo de dato | Valor por defecto | Descripción |
|---|---|---|---|
| cache_by_default | Boolean | TRUE |
si es TRUE, las llamadas a funciones se cachean
por defecto
|
| cached_functions | Array | nombres de funciones que siempre se cachearán | |
| non_cached_functions | Array | nombres de funciones que nunca deben cachearse |
Usar la función call() es lo mismo que usar
call_user_func_array() en PHP:
$cache->call('veryExpensiveFunc', $params);
// $params is an array
// For example to call veryExpensiveFunc(1, 'foo', 'bar') with
// caching, you can use
// $cache->call('veryExpensiveFunc', array(1, 'foo', 'bar'))
Zend_Cache_Frontend_Function es lo bastante inteligente
como para cachear tanto el valor de retorno de la función como su salida interna.
![]() |
Nota |
|---|---|
Se puede pasar cualquier función interna o definida por el usuario, con la
excepción de |
Zend_Cache_Frontend_Class es diferente de
Zend_Cache_Frontend_Function porque permite cachear
llamadas a métodos de objetos y métodos estáticos.
Tabla 17.3. Opciones del frontend Class
| Opción | Tipo de dato | Valor por defecto | Descripción |
|---|---|---|---|
| cached_entity (requerido) | Mixed | si se establece con un nombre de clase, se cacheará una clase abstracta y solo se usarán llamadas estáticas; si se establece con un objeto, se cachearán los métodos de ese objeto | |
| cache_by_default | Boolean | TRUE |
si es TRUE, las llamadas se cachearán por
defecto
|
| cached_methods | Array | nombres de métodos que siempre se cachearán | |
| non_cached_methods | Array | nombres de métodos que nunca deben cachearse |
Por ejemplo, para cachear llamadas estáticas:
class Test {
// Static method
public static function foobar($param1, $param2) {
echo "foobar_output($param1, $param2)";
return "foobar_return($param1, $param2)";
}
}
// [...]
$frontendOptions = array(
'cached_entity' => 'Test' // The name of the class
);
// [...]
// The cached call
$result = $cache->foobar('1', '2');
Para cachear llamadas a métodos clásicos:
class Test {
private $_string = 'hello !';
public function foobar2($param1, $param2) {
echo($this->_string);
echo "foobar2_output($param1, $param2)";
return "foobar2_return($param1, $param2)";
}
}
// [...]
$frontendOptions = array(
'cached_entity' => new Test() // An instance of the class
);
// [...]
// The cached call
$result = $cache->foobar2('1', '2');
Zend_Cache_Frontend_File es un frontend gobernado por el
tiempo de modificación de un "archivo maestro". Es realmente interesante para
ejemplos en cuestiones de configuración o plantillas. También es posible usar
múltiples archivos maestros.
Por ejemplo, tiene un archivo de configuración XML que es analizado
por una función que devuelve un "objeto de configuración" (como con
Zend_Config). Con
Zend_Cache_Frontend_File, se puede almacenar el "objeto de
configuración" en caché (para evitar el análisis del archivo de configuración
XML cada vez) pero con una especie de dependencia fuerte del
"archivo maestro". Así, si el archivo de configuración
XML se modifica, la caché se invalida inmediatamente.
Tabla 17.4. Opciones del frontend File
| Opción | Tipo de dato | Valor por defecto | Descripción |
|---|---|---|---|
| master_file (obsoleto) | String | '' | la ruta y el nombre completos del archivo maestro |
| master_files | Array | array() |
un array con las rutas completas de los archivos maestros |
| master_files_mode | String | Zend_Cache_Frontend_File::MODE_OR |
Zend_Cache_Frontend_File::MODE_AND o
Zend_Cache_Frontend_File::MODE_OR; si es
MODE_AND, todos los archivos maestros deben
ser tocados para obtener una invalidación de la caché; si es
MODE_OR, basta con que se toque un solo
archivo maestro para obtener una invalidación de la caché
|
| ignore_missing_master_files | Boolean | FALSE |
si es TRUE, los archivos maestros faltantes
se ignoran silenciosamente (de lo contrario se lanza una excepción)
|
Zend_Cache_Frontend_Page es como
Zend_Cache_Frontend_Output pero está diseñado para una página
completa. Es imposible usar Zend_Cache_Frontend_Page para
cachear solo un bloque.
Por otro lado, el "id de caché" se calcula automáticamente con
$_SERVER['REQUEST_URI'] y (dependiendo de las opciones)
$_GET, $_POST, $_SESSION,
$_COOKIE, $_FILES. Además, solo hay que
llamar a un método (start()) porque la llamada a
end() es completamente automática cuando termina la página.
Por el momento, no está implementado, pero planeamos añadir un sistema condicional HTTP para ahorrar ancho de banda (el sistema enviará un HTTP 304 Not Modified si la caché tiene un acierto y si el navegador ya tiene la versión correcta).
![]() |
Nota |
|---|---|
Este frontend opera registrando una función de retorno de llamada (callback) que
se invoca cuando se limpia el búfer de salida que utiliza. Para que esto funcione
correctamente, debe ser el último búfer de salida en la petición. Para garantizar
esto, el almacenamiento en búfer de salida usado por el Dispatcher debe
deshabilitarse llamando al método |
Tabla 17.5. Opciones del frontend Page
| Opción | Tipo de dato | Valor por defecto | Descripción |
|---|---|---|---|
| http_conditional | Boolean | FALSE |
usa el sistema http_conditional (no implementado por el momento) |
| debug_header | Boolean | FALSE |
si es TRUE, se añade un texto de depuración
antes de cada página en caché
|
| default_options | Array | array(...see below...) |
un array asociativo de opciones por defecto:
|
| regexps | Array | array() |
un array asociativo para establecer opciones solo para algunos
REQUEST_URI; las claves son expresiones regulares
(PCRE), los valores son arrays asociativos
con opciones específicas a establecer si la expresión regular
coincide con $_SERVER['REQUEST_URI'] (vea
default_options para la lista de opciones disponibles); si varias
expresiones regulares coinciden con
$_SERVER['REQUEST_URI'], solo se usará la
última
|
| memorize_headers | Array | array() |
un array de cadenas correspondientes a algunos nombres de cabeceras HTTP. Las cabeceras listadas se almacenarán junto con los datos de la caché y se "reproducirán" cuando la caché tenga un acierto |
El uso de Zend_Cache_Frontend_Page es realmente trivial:
// [...] // require, configuration and factory $cache->start(); // if the cache is hit, the result is sent to the browser // and the script stop here // rest of the page ...
un ejemplo más complejo que muestra una forma de obtener una gestión centralizada
de la caché en un archivo de arranque (para usar con
Zend_Controller, por ejemplo)
/*
* You should avoid putting too many lines before the cache section.
* For example, for optimal performances, "require_once" or
* "Zend_Loader::loadClass" should be after the cache section.
*/
$frontendOptions = array(
'lifetime' => 7200,
'debug_header' => true, // for debugging
'regexps' => array(
// cache the whole IndexController
'^/$' => array('cache' => true),
// cache the whole IndexController
'^/index/' => array('cache' => true),
// we don't cache the ArticleController...
'^/article/' => array('cache' => false),
// ... but we cache the "view" action of this ArticleController
'^/article/view/' => array(
'cache' => true,
// and we cache even there are some variables in $_POST
'cache_with_post_variables' => true,
// but the cache will be dependent on the $_POST array
'make_id_with_post_variables' => true
)
)
);
$backendOptions = array(
'cache_dir' => '/tmp/'
);
// getting a Zend_Cache_Frontend_Page object
$cache = Zend_Cache::factory('Page',
'File',
$frontendOptions,
$backendOptions);
$cache->start();
// if the cache is hit, the result is sent to the browser and the
// script stop here
// [...] the end of the bootstrap file
// these lines won't be executed if the cache is hit
Debido a cuestiones de diseño, en algunos casos (por ejemplo cuando se usan
códigos de retorno HTTP distintos de 200), podría
necesitar cancelar el proceso de caché actual. Por eso introducimos para este
frontend en particular el método cancel().
// [...] // require, configuration and factory
$cache->start();
// [...]
if ($someTest) {
$cache->cancel();
// [...]
}
// [...]
Zend_Cache_Frontend_Capture es como
Zend_Cache_Frontend_Output pero está diseñado para una página
completa. Es imposible usar Zend_Cache_Frontend_Capture para
cachear solo un bloque. Esta clase está diseñada específicamente para funcionar
en conjunto solo con el backend Zend_Cache_Backend_Static
para ayudar a cachear páginas completas de HTML / XML
u otro contenido en un archivo físico estático del sistema de archivos local.
Consulte la documentación de
Zend_Cache_Backend_Static para todos los casos de uso
relativos a esta clase.
![]() |
Nota |
|---|---|
Este frontend opera registrando una función de retorno de llamada (callback) que
se invoca cuando se limpia el búfer de salida que utiliza. Para que esto funcione
correctamente, debe ser el último búfer de salida en la petición. Para garantizar
esto, el almacenamiento en búfer de salida usado por el Dispatcher debe
deshabilitarse llamando al método |
![[Note]](images/note.png)