Hola @monicaonline, vuestro problema es muy común con catálogos grandes en PrestaShop 1.7.8.9, especialmente si el memory_limit de PHP es el estándar (128M o 256M) y el max_execution_time es bajo. La clave, como ya han comentado, es la generación por lotes (chunking) a través de un script que se ejecute con cron.
PrestaShop permite paginar los resultados al obtener productos. Podemos crear un script CLI (Command Line Interface) que se ejecute por cron y que procese los productos en bloques. Así, cada ejecución consume poca memoria y tiempo. El script debería:
- Inicializar el contexto de PrestaShop para poder usar sus clases.
- Definir un tamaño de lote (ej. 500 o 1000 productos).
- Usar
Product::getProducts() con los parámetros p (página) y n (número de productos por página) o offset y limit si usáis Db::getInstance()->executeS directamente.
- Generar el XML para ese lote y escribirlo en un archivo temporal.
- Repetir el proceso en sucesivas ejecuciones de cron, incrementando el
offset o p hasta que todos los productos hayan sido procesados.
Para el cron, podéis pasar el offset como parámetro. Aquí os dejo un fragmento de cómo sería la parte de obtención de productos para un script CLI. Podéis guardarlo en, por ejemplo, /ruta/a/tu/tienda/cli/generate_feed.php y llamarlo desde cron.
// Script para ser llamado por cron para generar feed en bloques
// path/to/your/cli/generate_feed.php
require_once(dirname(__FILE__).'/config/config.inc.php');
require_once(dirname(__FILE__).'/init.php');
$offset = (int)(isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : 0);
$limit = 1000; // Procesar 1000 productos por ejecución
$products = Product::getProducts(
(int)Context::getContext()->language->id,
$offset, $limit, 'id_product', 'ASC',
false, true, true
La llamada en cron sería algo como: php -q /ruta/a/tu/tienda/cli/generate_feed.php 0 para la primera ejecución, y luego php -q /ruta/a/tu/tienda/cli/generate_feed.php 1000, php -q /ruta/a/tu/tienda/cli/generate_feed.php 2000, etc., hasta que Product::getProducts devuelva un array vacío. Podéis usar un script wrapper para gestionar el offset o incluso un módulo simple que lo haga desde el Back Office, pero la lógica de chunking es la misma.