📄 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.