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.

Warning Faceted Search

Dejo la imagen en castellano, que luego hay quien me dice que sabe inglés... ;-)

Advertencia Búsqueda por facetas

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.

Cron cPanel PrestaShop Faceted Search

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:

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)

  1. Admin → Módulos → Gestión de módulos
  2. Buscar "Faceted Search" o facetas o ps_facetedsearch
  3. Botón Reconstruir todo el indice de precios
  4. 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:

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.

PRESTASHOP 1.8 - Módulo Faceted search

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

Diferencias con PrestaShop 1.7

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

  1. Verificar que el módulo ps_facetedsearch está activo
  2. Ejecutar rebuild manual desde administración
  3. Comprobar logs de errores PHP/MySQL
  4. Verificar permisos de base de datos

Aviso importante (Disclaimer)

⚠️ Esta documentación se entrega tal y como está, sin garantías.

Referencias


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

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:

Ficheros relacionados (secundarios)

/config/settings.inc.php

// Solo contiene configuración básica, no SMTP
define('_PS_MODE_DEV_', false);

/classes/Mail.php

/mails/

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.