Ver índice de contenidos del libro

A.3. HttpCacheServiceProvider

El proveedor HttpCacheProvider integra el proxy inverso de Symfony, lo que permite mejorar exponencialmente el rendimiento de las aplicaciones Silex.

A.3.1. Parámetros de configuración

El proveedor define los siguientes parámetros configurables:

  • http_cache.cache_dir: el directorio donde se guardan las páginas cacheadas por la cache de HTTP.
  • http_cache.options (opcional): un array con varias opciones de configuración del constructor de la clase HttpCache.

A.3.2. Servicios proporcionados

El proveedor proporciona los siguientes servicios:

  • http_cache: una instancia de la clase HttpCache.

  • http_cache.esi: una instancia de la clase Esi, que proporciona soporte para ESI en las instancias de Request y Response.

  • http_cache.store: una instancia de la clase Store, que implementa la lógica necesaria para almacenar los metadatos de la cache.

A.3.3. Cómo se registra el proveedor

El siguiente código muestra un ejemplo de cómo registrar este proveedor:

$app->register(new Silex\Provider\HttpCacheServiceProvider(), array(
    'http_cache.cache_dir' => __DIR__.'/cache/',
));

A.3.4. Ejemplos de uso

Silex soporta los proxy inversos más populares del mercado, como por ejemplo Varnish. Para ello solo tienes que añadir las correspondientes cabeceras de la cache de HTTP en el objeto Response:

use Symfony\Component\HttpFoundation\Response;
 
$app->get('/', function() {
    return new Response('Foo', 200, array(
        'Cache-Control' => 's-maxage=5',
    ));
});

Truco Si quieres que Silex se fíe de los valores de las cabeceras X-Forwarded-For* del proxy inverso, tendrás que configurar tu aplicación tal y como se explica en este artículo de la documentación de Symfony.

Si por ejemplo ejecutas Varnish en la misma máquina en la que se ejecuta la aplicación, tienes que configurar lo siguiente:

use Symfony\Component\HttpFoundation\Request;
 
Request::setTrustedProxies(array('127.0.0.1', '::1'));
$app->run();

Si no tienes un proxy como Varnish instalado en tu servidor, este proveedor te permite utilizar el proxy inverso nativo de Symfony. Para ello, cambia la famosa línea $app->run() de tu aplicación Silex por lo siguiente para utilizar el servicio http_cache:

use Symfony\Component\HttpFoundation\Request;
 
Request::setTrustedProxies(array('127.0.0.1'));
$app['http_cache']->run();

Este proveedor soporta incluso el uso de ESI:

$app->get('/', function() {
    $response = new Response(<<<EOF
<html>
    <body>
        Hello
        <esi:include src="/included" />
    </body>
</html>
 
EOF
    , 200, array(
        'Surrogate-Control' => 'content="ESI/1.0"',
    ));
 
    $response->setTtl(20);
 
    return $response;
});
 
$app->get('/included', function() {
    $response = new Response('Foo');
    $response->setTtl(5);
 
    return $response;
});
 
$app['http_cache']->run();

Si no utilizas ESI en tu aplicación, puedes desactivar esta funcionalidad para mejorar ligeramente el rendimiento de la aplicación:

$app->register(new Silex\Provider\HttpCacheServiceProvider(), array(
   'http_cache.cache_dir' => __DIR__.'/cache/',
   'http_cache.esi'       => null,
));

Truco Para que te sea más fácil comprobar si la caché HTTP está funcionando bien, puedes establecer la opción debug a true en la aplicación. De esta manera, Symfony añade automáticamente a todas las respuestas una cabecera llamada X-Symfony-Cache con información sobre si la página se ha obtenido de la caché (lo que se conoce como cache hit) o si por el contrario la página se ha generado dinámicamente (lo que se conoce como cache miss).

Si no utilizas el proveedor de sesiones de Symfony, es recomendable que establezcas la opción session.cache_limiter de PHP a un valor vacío para evitar el comportamiento por defecto de PHP.

Por último, no olvides asegurarte de que el servidor web no sobreescribe tu configuración de la cache de las páginas.