Prestashop Prestashop 1.7 _layered_filter_block mucho espacio (gigante) y problemas con el hosting Prestashop 1.7 _layered_filter_block, problemas de rendimiento y de hosting Muchas veces los clientes le echan la culpa al hosting, de todos sus males, pero la triste realidad es que los clientes o mejor dicho sus desarrolladores de la tienda, de su PrestaShop , obvian el paquete "mantenimiento anual" y obvian, el dejar las cosas bien para que luego no halla problemas. Hablamos del Faceted Search o navegación por facetas. Modulo que viene con advertencias claras de como debemos usarlo, pero que en el 90% de las tiendas de un Hosting basadas en PrestaShop, tiene habilitado en las tareas cron del cliente. Hoy un cliente, me pidio soporte para ver porque su máquina de 256GB de ram, se iba cada dos por tres. Como no había datos en la monitorización que indicaran problemas de overload, fuimos a buscar a MySQL. Sus logs nos hablaban de muchos problemas de reinicio, y de requerir ingentes cantidades de memoria por InnoDb. Pues a buscar al culpable. [root@servidor30 mysqltuner]# du -sh /var/lib/mysql/user_republic3/* | grep G 2,9G /var/lib/mysql/user_republic3/ps_guest.ibd 263G /var/lib/mysql/user_republic3/ps_layered_filter_block.ibd Maravilloso la tabla ps_layered_filter_block perteneciente al penoso módulo Búsqueda por facetas o Faceted Search layered La de ps_guest esa es otra de esas tablas que puedes limpiar regularmente en PrestaShop, junto a ps_guest , ps_connections , ps_connections_page , ps_connections_source , ps_page_viewed . Ojo, que limpiar no solo es hacer TRUNCATE como algún experto dice por ahi. Igual te interesa limpiar desde un tiempo, como puede ser en ps_cart_product , ps_cart y ps_cart_discount . Backups, por favor, siempre backup antes de empezar cualquier cosa, sobre todo cuando lees cosas por Internet. Pues la culpa es del desarrollador o del activador de este módulo en el area de administración que parece que les cuesta leer. Dejo la imagen en castellano, que luego hay quien me dice que sabe inglés... ;-) Configurar el cron Lo dejo también porque esta es la madre de de muchos de los problemas heredados en un hosting por causa de expertos en desarrollo web. Como se les atraganta pues lo obvian. Los chicos de PrestaShop, también son muy simpáticos, porque el mensaje no es del todo correcto. Si uno pone eso el cron (y como lo hace a través de cPanel, DirectAdmin, o panel, en lugar de trabajar con SSH) no funcionará. A veces hay que leer y entender. Eso es una URL, y el cron es un programa de consola, que no puede llamar de esa forma a una url salvo... usando +curl * MAILTO="" 15 2 * * * /usr/bin/curl --user-agent cPanel-Cron 'https://dominio.com/en/module/ps_facetedsearch/cron?ajax=1&action=indexPrices&token=bj7shgggg' 25 2 * * * /usr/bin/curl --user-agent cPanel-Cron 'https://dominio.com/en/module/ps_facetedsearch/cron?ajax=1&action=indexPrices&full=1&token=bj7shgggg' 35 2 * * * /usr/bin/curl --user-agent cPanel-Cron 'https://dominio.com/en/module/ps_facetedsearch/cron?ajax=1&action=indexAttributes&token=bj7shgggg' 45 2 * * * /usr/bin/curl --user-agent cPanel-Cron 'https://dominio.com/en/module/ps_facetedsearch/cron?ajax=1&action=clearCache&token=bj7shgggg En el shell se puede ejecutar cada uno de ellos y ver si te funcionan Por si usas cPanel te lo dejo. Pero ten atención a las comillas simples. Aviso Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris Si necesitas soporte profesional puedes contratar con Castris soporte profesional . PrestaShop 8 - Solución tabla ps_layered_filter_block gigante Introducción En PrestaShop 8, el módulo ps_facetedsearch (antiguo blocklayered) utiliza la tabla ps_layered_filter_block como cache para los filtros de navegación por facetas. Esta tabla puede crecer descontroladamente hasta alcanzar varios gigabytes, causando problemas de espacio en disco y rendimiento. Síntomas: Tabla ps_layered_filter_block de varios GB (reportados casos de 500GB+) Lentitud en páginas de categorías Errores de espacio en disco Backup/restore problemáticos Verificación del problema 1. Comprobar el tamaño de las tablas layered SELECT table_name, ROUND(((data_length + index_length) / 1024 / 1024 / 1024), 2) AS "Size in GB", ROUND((data_length / 1024 / 1024 / 1024), 2) AS "Data GB", ROUND((index_length / 1024 / 1024 / 1024), 2) AS "Index GB" FROM information_schema.tables WHERE table_schema = 'tu_nombre_bd' AND table_name LIKE '%layered%' ORDER BY (data_length + index_length) DESC; 2. Verificar archivo físico en disco # Comprobar tamaño real del archivo InnoDB ls -lah /var/lib/mysql/tu_bd/ps_layered_filter_block.ibd Problema típico: La tabla muestra X GB en consulta pero el archivo físico ocupa mucho más espacio (fragmentación InnoDB). Tablas involucradas en PrestaShop 8 Tabla Función ¿Seguro truncar? ps_layered_filter_block Cache de filtros (el problema principal) ✅ SÍ - Se regenera automáticamente ps_layered_category Cache de categorías con filtros ✅ SÍ - Se regenera automáticamente ps_layered_product_attribute Cache de atributos de productos ✅ SÍ - Se regenera automáticamente ps_layered_filter Plantillas de filtros configuradas ❌ NO - Contiene tu configuración Soluciones Opción 1: Desde administración (recomendado) Admin → Módulos → Gestión de módulos Buscar "Faceted Search" o facetas o ps_facetedsearch Botón Reconstruir todo el indice de precios Botón "Rebuild entire layered structure" Opción 2: Limpieza SQL manual Backup obligatorio primero: -- Backup de seguridad mysqldump -u user_bd -p tu_bd ps_layered_filter_block > backup_layered_filter_block.sql -- O backup completo de tablas layered mysqldump -u user_bd -p tu_bd ps_layered_filter ps_layered_filter_block ps_layered_category ps_layered_product_attribute > backup_layered_completo.sql Método conservador: -- Solo limpiar el cache principal TRUNCATE TABLE ps_layered_filter_block; Método completo: -- Limpiar todas las tablas de cache (mantener ps_layered_filter) TRUNCATE TABLE ps_layered_filter_block; DELETE FROM ps_layered_category; DELETE FROM ps_layered_product_attribute; Opción 3: Liberar espacio físico (InnoDB) Si después del TRUNCATE el archivo físico sigue ocupando mucho espacio: Método A: OPTIMIZE TABLE -- Intentar optimización (puede funcionar en algunos casos) OPTIMIZE TABLE ps_layered_filter_block; ⚠️ Nota: OPTIMIZE TABLE no siempre funciona efectivamente en InnoDB con innodb_file_per_table=ON . Método B: Regenerar motor (más efectivo) -- 1. Vaciar tabla TRUNCATE TABLE ps_layered_filter_block; -- 2. Regenerar motor para liberar espacio físico ALTER TABLE ps_layered_filter_block ENGINE=InnoDB; Verificar liberación de espacio: Esto solo es a nivel de administrador del sistema. # Comprobar que el archivo físico se redujo ls -lah /var/lib/mysql/tu_bd/ps_layered_filter_block.ibd # Verificar en SQL SELECT table_name, ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size in MB" FROM information_schema.tables WHERE table_schema = 'tu_bd' AND table_name = 'ps_layered_filter_block'; Regeneración automática Después de la limpieza, el cache se regenerará automáticamente cuando: Los usuarios naveguen por categorías con filtros Se ejecute el rebuild desde administración Se indexen productos Cron necesario Este módulo requiere, si o si, la instalación de varas tareas cron. De no hacerlo, las tablas se haran gigantes y puedes tener problemas con tu hoster. Prevención futura (como admin) 1. Limpieza programada # Añadir al crontab (limpieza semanal) 0 2 * * 0 mysql -u root -pTU_PASSWORD tu_bd -e "TRUNCATE TABLE ps_layered_filter_block;" 2. Monitorización -- Consulta para monitorizar crecimiento SELECT table_name, ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size_MB", table_rows FROM information_schema.tables WHERE table_schema = 'tu_bd' AND table_name = 'ps_layered_filter_block'; 3. Configuración del módulo Revisar configuración de cache en ps_facetedsearch Considerar reducir el número de filtros si no son necesarios Optimizar plantillas de filtros para categorías específicas Diferencias con PrestaShop 1.7 El módulo se llama ps_facetedsearch (vs blocklayered ) Cache más agresivo pero también más eficiente Función invalidateLayeredFilterBlockCache() optimizada Rebuild más rápido pero requiere más memoria Mejor integración con el motor de búsqueda Troubleshooting Problema: "Table ps_layered_filter_block doesn't exist" -- Recrear tabla manualmente CREATE TABLE IF NOT EXISTS `ps_layered_filter_block` ( `hash` char(32) NOT NULL DEFAULT '', `data` text, PRIMARY KEY (`hash`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Problema: Cache no se regenera Verificar que el módulo ps_facetedsearch está activo Ejecutar rebuild manual desde administración Comprobar logs de errores PHP/MySQL Verificar permisos de base de datos Aviso importante (Disclaimer) ⚠️ Esta documentación se entrega tal y como está, sin garantías. Realiza siempre backup antes de cualquier operación Testa en entorno de desarrollo primero Ten conocimientos de MySQL/InnoDB antes de proceder Para soporte profesional, contacta con expertos en PrestaShop Referencias Repositorio oficial ps_facetedsearch Issue GitHub sobre crecimiento de tabla Documentación técnica PrestaShop 8 Actualizado: Enero 2025 - Basado en experiencia con PrestaShop 8.x Aviso Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris Si necesitas soporte profesional puedes contratar con Castris soporte profesional . Para localizar la versión de PrestaShop a través de MySQL usando TablePlus o similar Consultas SQL para identificar la versión 1. Tabla ps_configuration (método principal) SELECT name, value FROM ps_configuration WHERE name = 'PS_VERSION_DB'; 2. Alternativa con PS_INSTALL_VERSION SELECT name, value FROM ps_configuration WHERE name = 'PS_INSTALL_VERSION'; 3. Si las anteriores fallan, buscar todas las versiones SELECT name, value FROM ps_configuration WHERE name LIKE '%VERSION%'; Métodos adicionales 4. Tabla ps_shop (para multishop) SELECT * FROM ps_shop; (A veces contiene información de versión) 5. Verificar estructura de tablas DESCRIBE ps_configuration; (Las diferencias en estructura pueden indicar versiones) Notas importantes Prefijo de tablas : Cambia ps_ por el prefijo real de la instalación Versiones muy antiguas : En PrestaShop < 1.5 puede que no exista PS_VERSION_DB Actualizaciones : Si fue actualizado, PS_INSTALL_VERSION puede mostrar la versión inicial Aviso Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris Si necesitas soporte profesional puedes contratar con Castris soporte profesional . Configuración de correo Prestashop. Localización En PrestaShop, la configuración de correo está principalmente en MySQL , no en ficheros de configuración. Ubicación en MySQL 1. Configuración principal de correo SELECT name, value FROM ps_configuration WHERE name IN ( 'PS_MAIL_METHOD', 'PS_MAIL_SERVER', 'PS_MAIL_USER', 'PS_MAIL_PASSWD', 'PS_MAIL_SMTP_ENCRYPTION', 'PS_MAIL_SMTP_PORT', 'PS_MAIL_TYPE' ); 2. Configuraciones adicionales de correo SELECT name, value FROM ps_configuration WHERE name LIKE '%MAIL%'; 3. Valores importantes a revisar: PS_MAIL_METHOD : 1 = Mail PHP, 2 = SMTP PS_MAIL_SERVER : Servidor SMTP PS_MAIL_USER : Usuario SMTP PS_MAIL_PASSWD : Contraseña (encriptada) PS_MAIL_SMTP_ENCRYPTION : ssl/tls/off PS_MAIL_SMTP_PORT : Puerto (25, 587, 465) Ficheros relacionados (secundarios) /config/settings.inc.php // Solo contiene configuración básica, no SMTP define('_PS_MODE_DEV_', false); /classes/Mail.php Lógica de envío, no configuración /mails/ Plantillas de correo, no configuración Logs de correo SELECT * FROM ps_mail ORDER BY date_add DESC LIMIT 10; Aviso Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris Si necesitas soporte profesional puedes contratar con Castris soporte profesional .