Por Ismael Ambrosi @iambrosi

El cache es una parte muy importante de tu aplicación, ya que ayuda a mejorar la performance del servidor al no ejecutar código innecesario en cada petición. Esto es especialmente cierto si el servidor se está corriendo con recursos limitados. El calentamiento del cache (o warmup) permite guardar datos específicos de tu aplicación en cache por medio del CacheWarmer. Symfony2 incluye un calentador de cache que te ayuda a guardar partes de tu aplicación en cache, antes de que la aplicación quede disponible para el usuario.

El CacheWarmer es ejecutado automáticamente si el cache no existe o ha caducado, creando así el cache de tu aplicación. También puede ser ejecutado manualmente con el comando cache:warmup o en el momento de limpiar el cache con cache:clear (!!! sin la opción --no-warmup).

Creando el “Warmer”

El Cache Warmer debe ser creado como un servicio que implementa la interface CacheWarmerInterface. Puedes ver en la sección de Service Container como crear servicios en Symfony2.

La interface CacheWarmerInterface nos permite implementar dos métodos, warmup y isOptional. El primero creará el cache y el segundo indicará si el warmer puede ser ignorado bajo ciertas condiciones o si debe ejecutarse siempre sin excepciones.

# src/Acme/DemoBundle/CacheWarmer/MyCacheWarmer.php
namespace Acme\DemoBundle\CacheWarmer;

use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;

class MyCacheWarmer implements CacheWarmerInterface
{
    /**
     * Warms up the cache.
     *
     * @param string $cacheDir The cache directory
     */
    public function warmUp($cacheDir)
    {
        // Process your cache content
        $cacheContent = 'Content to be cached';

        // Stores the cache
        file_put_contents($cacheDir.'/file.php', $cacheContent);
    }

    /**
     * Checks whether this warmer is optional or not.
     *
     * Optional warmers can be ignored on certain conditions.
     *
     * A warmer should return true if the cache can be
     * generated incrementally and on-demand.
     *
     * @return Boolean true if the warmer is optional, false otherwise
     */
    public function isOptional()
    {
        return true;
    }
}

También puedes extender la clase CacheWarmer la cual contiene un método para manejar la creación de los archivos de cache. Al extender esta clase, ya estarás implementando la interface mencionada anteriormente.

# src/Acme/DemoBundle/CacheWarmer/MyCacheWarmer.php
namespace Acme\DemoBundle\CacheWarmer;

use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmer;

class MyCacheWarmer extends CacheWarmer
{

    /**
     * Warms up the cache.
     *
     * @param string $cacheDir The cache directory
     */
    public function warmUp($cacheDir)
    {
        // Process your cache content
        $cacheContent = 'Content to be cached';

        // Stores the cache
        $this->writeCacheFile($cacheDir.'/file.php', $cacheContent);
    }

Creando el servicio

Una vez creada la clase, debes notificarle al Service Container que un nuevo Cache Warmer ha sido creado, para que pueda ser ejecutado. Puedes hacerlo agregando tu clase como servicio, incluyendo el tag kernel.cache_warmer.

<!-- src/Acme/DemoBundle/Resources/config/services.xml -->
<parameters>
    <!-- ... -->
    <parameter key="my_cache_warmer.class">Acme\DemoBundle\CacheWarmer\MyCacheWarmer</parameter>
</parameters>

<services>
    <service id="my_cache_warmer" class="%my_cache_warmer.class%">
        <tag name="kernel.cache_warmer">
    </service>
</services>

Ahora, cada vez que Symfony prepare el cache, tu Warmer va a ser ejecutado, creando tu propio cache.