# 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](https://build.prestashop-project.org/prestashop-specs/1.7/modules/ps_facetedsearch.html) 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](https://multimedia.castris.com/imagenes/wiki/sysadmin/warning-prestashop-module-faceteds-earch.jpg)

> Dejo la imagen en castellano, que luego hay quien me dice que sabe inglés... ;-)

![Advertencia Búsqueda por facetas](https://multimedia.castris.com/imagenes/wiki/sysadmin/advertencia-prestahsop-modulo-busqueda-por-facetas.jpg)

## 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](https://multimedia.castris.com/imagenes/wiki/sysadmin/cron-cpanel-prestahsop.jpg)


##### 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](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/store/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

```sql
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

```bash
# 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:

```sql
-- 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:

```sql
-- Solo limpiar el cache principal
TRUNCATE TABLE ps_layered_filter_block;
```

#### Método completo:

```sql
-- 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

```sql
-- 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)

```sql
-- 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.

```bash
# 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. 

![PRESTASHOP 1.8 - Módulo Faceted search](https://multimedia.castris.com/imagenes/wiki/sysadmin/Prestashop_1.8_ps_layered_filter_block.jpg)

## Prevención futura (como admin)

### 1. Limpieza programada

```bash
# 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

```sql
-- 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"

```sql
-- 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.** 

- 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](https://github.com/PrestaShop/ps_facetedsearch)
- [Issue GitHub sobre crecimiento de tabla](https://github.com/PrestaShop/PrestaShop/issues/17318)
- [Documentación técnica PrestaShop 8](https://devdocs.prestashop-project.org/8/development/components/faceted-search/)

---

**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](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/store/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)
```sql
SELECT name, value 
FROM ps_configuration 
WHERE name = 'PS_VERSION_DB';
```

### 2. Alternativa con `PS_INSTALL_VERSION`
```sql
SELECT name, value 
FROM ps_configuration 
WHERE name = 'PS_INSTALL_VERSION';
```

### 3. Si las anteriores fallan, buscar todas las versiones
```sql
SELECT name, value 
FROM ps_configuration 
WHERE name LIKE '%VERSION%';
```

## Métodos adicionales

### 4. Tabla `ps_shop` (para multishop)
```sql
SELECT * FROM ps_shop;
```
(A veces contiene información de versión)

### 5. Verificar estructura de tablas
```sql
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](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/store/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
```sql
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
```sql
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`
```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
```sql
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](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/store/soporte-profesional).