📄 Cache de Smarty y compilacion de templates

Actualizado: 2024-12-01

Smarty compila los templates .tpl a PHP nativo y los cachea en var/cache/. La configuracion correcta de este cache es critica: en desarrollo necesitas recompilacion automatica, en produccion necesitas maximo rendimiento.

#Como funciona el cache de Smarty

Flujo de compilacion Smarty
text
FLUJO DE RENDERIZADO
1. Smarty recibe template .tpl
2. Comprueba si existe version compilada en var/cache/smarty/compile/
3. Si NO existe o ha cambiado → compila .tpl a .php
4. Ejecuta el .php compilado
5. (Opcional) Cachea el HTML resultante en var/cache/smarty/cache/

DIRECTORIOS CLAVE
- var/cache/prod/smarty/compile/  → Templates compilados (PHP)
- var/cache/prod/smarty/cache/    → HTML cacheado (si cache activo)
- var/cache/dev/smarty/compile/   → Lo mismo en entorno dev

IMPACTO EN RENDIMIENTO
- Template sin compilar: ~50ms por renderizado
- Template compilado (sin cache HTML): ~5ms
- Template con cache HTML: ~0.5ms
- La primera visita siempre es lenta (compilacion)
- Visitas siguientes usan cache

#Configuracion en el BO

Parametros avanzados → Rendimiento → Smarty
text
COMPILACION DE TEMPLATES
- Nunca recompilar: Maximo rendimiento, no detecta cambios
  → Usar en PRODUCCION (requiere limpiar cache manual tras cambios)
- Recompilar si se modifican: Equilibrio, comprueba mtime del .tpl
  → Usar en STAGING o si haces cambios puntuales
- Forzar compilacion: Recompila SIEMPRE cada request
  → Usar solo en DESARROLLO (muy lento)

CACHE DE SMARTY
- Si: Cachea HTML resultante (maximo rendimiento)
- No: Solo usa compilacion, sin cache HTML

LIMPIAR CACHE
- Boton "Limpiar cache de Smarty" en Parametros avanzados → Rendimiento
- O borrar manualmente: rm -rf var/cache/prod/smarty/*
- SIEMPRE limpiar despues de cambiar templates en produccion

#Modos de compilacion

Configurar Smarty programaticamente
php
<?php

// ── Acceder a la configuracion de Smarty ──
$smarty = Context::getContext()->smarty;

// ── Modos de compilacion (config en BD) ──
// PS_SMARTY_FORCE_COMPILE:
//   0 = Nunca recompilar
//   1 = Recompilar si se modifican
//   2 = Forzar compilacion siempre
Configuration::updateValue('PS_SMARTY_FORCE_COMPILE', 0); // Produccion

// ── Cache de Smarty ──
// PS_SMARTY_CACHE:
//   0 = Desactivado
//   1 = Activado
Configuration::updateValue('PS_SMARTY_CACHE', 1);

// ── En el codigo de Smarty interno de PS ──
// config/smarty.config.inc.php controla estos valores:
$smarty->force_compile  = (bool) Configuration::get('PS_SMARTY_FORCE_COMPILE') == 2;
$smarty->compile_check  = (bool) Configuration::get('PS_SMARTY_FORCE_COMPILE') >= 1;
$smarty->caching        = (int) Configuration::get('PS_SMARTY_CACHE');
$smarty->cache_lifetime = 31536000; // 1 año (se invalida manualmente)

// ── Limpiar cache desde un modulo ──
Tools::clearSmartyCache();
// O mas selectivo:
Tools::clearCache(); // Limpia todo el cache de PS

#Cache de templates en modulos

Usar cache_id en modulos
php
<?php

// ── Cache por modulo y parametros ──
// En hooks de display, Smarty puede cachear el HTML
public function hookDisplayHome(): string
{
    // Cache ID unico por idioma y moneda
    $cacheId = $this->name . '|' 
        . (int) Context::getContext()->language->id . '|'
        . (int) Context::getContext()->currency->id;

    // Comprobar si ya esta en cache
    if (!$this->isCached('module:mymodule/views/templates/hook/home.tpl', $cacheId)) {
        // Solo ejecutar logica si no esta cacheado
        $products = $this->getExpensiveProductQuery();
        $this->context->smarty->assign('products', $products);
    }

    return $this->fetch('module:mymodule/views/templates/hook/home.tpl', $cacheId);
}

// ── Invalidar cache del modulo cuando cambian datos ──
public function hookActionProductUpdate(): void
{
    // Limpiar cache de este modulo cuando se actualiza un producto
    $this->_clearCache('module:mymodule/views/templates/hook/home.tpl');
    // O limpiar todo el cache del modulo:
    $this->_clearCache('*');
}

// ── Cache con TTL personalizado ──
// En el template:
// {cache_lifetime=3600} → 1 hora
// Pero en PS se suele invalidar por evento, no por tiempo
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.