PrestaShop Límite de Memoria Excedido: Causas y Soluciones
Comprender memory_limit de PHP
La directiva memory_limit de PHP controla cuánta RAM puede consumir un único proceso PHP antes de que el motor lo termine con un error fatal. Cuando ves el mensaje "Allowed memory size of X bytes exhausted" en PrestaShop, significa que una solicitud PHP específica intentó usar más memoria de la que permite el límite configurado.
Cada carga de página en PrestaShop ejecuta código PHP que carga el framework, se conecta a la base de datos, procesa datos, renderiza plantillas y envía HTML al navegador. Cada uno de estos pasos consume memoria. El memory_limit actúa como una red de seguridad: impide que un proceso descontrolado consuma toda la RAM disponible del servidor, lo que causaría la caída de otros procesos y potencialmente la del servidor completo.
El memory_limit predeterminado en PHP es típicamente 128M (128 megabytes). PrestaShop recomienda oficialmente al menos 256M, y muchas tiendas requieren 512M o más dependiendo del tamaño del catálogo, los módulos instalados y el tráfico. Comprender qué impulsa el consumo de memoria te ayuda a determinar el valor correcto para tu tienda en lugar de aumentar el límite a ciegas.
Cómo Verificar Tu Límite de Memoria Actual
Hay varias formas de verificar qué límite de memoria está usando actualmente tu instalación de PrestaShop.
Desde el Back Office de PrestaShop
Navega a Parámetros Avanzados > Información. Esta página muestra la configuración PHP de tu servidor, incluido el valor actual de memory_limit. PrestaShop también mostrará advertencias si el valor está por debajo del mínimo recomendado.
Usando phpinfo()
Crea un archivo temporal llamado info.php en el directorio raíz de PrestaShop con este contenido:
<?php phpinfo(); ?>Accede a él a través de tu navegador en tudominio.com/info.php. Busca en la página "memory_limit" para ver tanto el Valor Local (lo que está realmente activo) como el Valor Master (lo que está configurado en php.ini). El valor local puede diferir del valor master si un .htaccess, .user.ini o la aplicación misma lo sobreescribe.
Importante: Elimina este archivo inmediatamente después de verificar. Una página phpinfo() expone la configuración detallada del servidor que los atacantes pueden explotar.
Vía Línea de Comandos
Si tienes acceso SSH, ejecuta:
php -i | grep memory_limitTen en cuenta que la configuración PHP de CLI puede diferir de la configuración del servidor web. Para verificar el valor web-facing, usa el método phpinfo() o el back office de PrestaShop.
Causas Comunes de Errores de Límite de Memoria
Importaciones de Productos Masivas
La importación de productos mediante CSV es una de las operaciones más intensivas en memoria de PrestaShop. Cada fila del archivo de importación se carga en memoria, se procesa, se valida y se inserta en la base de datos. Un archivo CSV con 10.000 productos, cada uno con múltiples combinaciones, imágenes y descripciones, puede requerir fácilmente 512MB o más de memoria.
La herramienta de importación de PrestaShop procesa productos en lotes, pero el tamaño del lote y la cantidad de datos por producto determinan la huella de memoria total. Los campos de texto grandes (descripciones con HTML), muchas columnas y archivos codificados en UTF-8 con caracteres especiales aumentan el uso de memoria por fila.
Para reducir el consumo de memoria durante las importaciones:
- Divide los archivos CSV grandes en porciones más pequeñas (1.000-2.000 filas cada una)
- Importa primero los productos sin imágenes, luego importa las imágenes por separado
- Desactiva los módulos no esenciales durante la importación (estadísticas, indexación de búsqueda)
- Usa la importación por línea de comandos si está disponible, que evita los límites de tiempo del servidor web
Productos con Muchas Combinaciones
Los productos con muchos atributos (talla, color, material) generan combinaciones de forma exponencial. Un producto con 5 tallas, 10 colores y 3 materiales crea 150 combinaciones. Cada combinación es un registro separado en la base de datos con su propio precio, referencia, stock y asociaciones de imágenes. Cuando PrestaShop carga una página de producto para edición en el back office, carga todas las combinaciones en memoria simultáneamente.
Los productos con 500+ combinaciones son un punto problemático conocido. Con 1.000+ combinaciones, casi con seguridad alcanzarás los límites de memoria con la configuración predeterminada. Las soluciones incluyen:
- Aumentar
memory_limita 512M o 1G para el back office - Reestructurar los productos para reducir el número de combinaciones (productos separados en lugar de mega-combinaciones)
- Usar módulos que gestionen las combinaciones de forma más eficiente mediante paginación
Módulos Sobrecargados o Mal Codificados
Los módulos de terceros son una fuente frecuente de problemas de memoria. Los problemas comunes incluyen:
- Cargar tablas enteras de la base de datos en arrays PHP: Un módulo que ejecuta
SELECT * FROM ps_orderssin una cláusula LIMIT carga en memoria cada pedido jamás realizado. Para una tienda con 100.000 pedidos, esto puede consumir cientos de megabytes. - Fugas de memoria en bucles: Módulos que procesan elementos en un bucle pero acumulan objetos sin liberarlos. El recolector de basura de PHP maneja los casos simples, pero las referencias circulares y las referencias almacenadas pueden impedir la limpieza.
- Registro excesivo: Registro de depuración que escribe arrays u objetos grandes en archivos de log, usando
var_export()oprint_r()en objetos complejos de PrestaShop, puede consumir cantidades enormes de memoria. - Procesamiento de imágenes no optimizado: Módulos que redimensionan o aplican marcas de agua a las imágenes usando GD o ImageMagick cargan la imagen completa sin comprimir en memoria. Una imagen de 5000x5000 píxeles con profundidad de color de 24 bits requiere aproximadamente 75MB de RAM solo para los datos de los píxeles.
Para identificar qué módulo está causando problemas de memoria, verifica cuidadosamente el mensaje de error. Generalmente incluye una ruta de archivo que apunta al módulo responsable. También puedes habilitar el modo de depuración de PrestaShop para obtener trazas de pila más detalladas.
Catálogos Grandes y Consultas Complejas
Las tiendas con decenas de miles de productos, muchas categorías y estructuras de atributos complejas ejercen más presión sobre la memoria durante la operación normal. Las páginas de categorías con navegación por capas (búsqueda facetada) son particularmente exigentes porque el motor de filtros debe calcular los valores de atributos disponibles a través de miles de productos.
El listado de productos del back office, el listado de pedidos y el listado de clientes cargan datos en memoria para su visualización. Con conjuntos de datos muy grandes, incluso la vista básica de lista puede alcanzar los límites de memoria, especialmente cuando los módulos añaden columnas o cálculos adicionales a estos listados.
Compilación de Plantillas Smarty
PrestaShop utiliza el motor de plantillas Smarty, que compila las plantillas en archivos PHP para un renderizado más rápido. El proceso de compilación en sí consume memoria, y las plantillas complejas con muchos includes, bucles y bloques condicionales requieren más memoria para compilarse. Después de la primera compilación se utilizan las versiones en caché, por lo que esto es principalmente un problema cuando se vacía la caché o durante el desarrollo.
Cómo Aumentar el Límite de Memoria
Método 1: php.ini
El método más fiable es editar directamente el archivo de configuración PHP. La ubicación depende de tu configuración:
- Debian/Ubuntu:
/etc/php/8.x/fpm/php.ini(PHP-FPM) o/etc/php/8.x/apache2/php.ini(mod_php) - CentOS/RHEL:
/etc/php.inio/etc/php.d/ - cPanel: MultiPHP INI Editor en WHM o cPanel
Encuentra la línea memory_limit y cámbiala:
memory_limit = 512MDespués de guardar, reinicia PHP-FPM o Apache:
# PHP-FPM
sudo systemctl restart php8.2-fpm
# Apache con mod_php
sudo systemctl restart apache2Método 2: .htaccess (Solo Apache con mod_php)
Añade esta línea al archivo .htaccess en el directorio raíz de PrestaShop:
php_value memory_limit 512MEste método solo funciona con Apache ejecutando mod_php. Si usas PHP-FPM (que es más común en configuraciones modernas), esta directiva se ignora silenciosamente o puede causar un error 500. Para verificar qué handler PHP estás usando, mira la línea Server API en la salida de phpinfo().
Método 3: .user.ini (PHP-FPM)
Crea o edita un archivo llamado .user.ini en el directorio raíz de PrestaShop:
memory_limit = 512MPHP-FPM lee archivos .user.ini desde la raíz del documento. Ten en cuenta que los cambios surten efecto después del período user_ini.cache_ttl (predeterminado 300 segundos / 5 minutos), por lo que es posible que necesites esperar o reiniciar PHP-FPM para que el cambio tenga efecto inmediatamente.
Método 4: Dentro del Código de PrestaShop
PrestaShop establece su propio límite de memoria en el archivo config/defines.inc.php. Busca una línea como:
@ini_set('memory_limit', '256M');Puedes aumentar este valor directamente en el código. Sin embargo, este enfoque tiene una limitación: la función ini_set() solo puede aumentar el límite de memoria hasta el valor establecido en php.ini. Si php.ini establece memory_limit = 128M y tu código intenta establecerlo en 512M, el límite real permanecerá en 128M (a menos que el valor master permita sobreescrituras, lo que depende de la clasificación PHP_INI_ALL vs PHP_INI_SYSTEM).
Método 5: Configuración Por Pool (PHP-FPM)
Si gestionas tu propio servidor, puedes establecer límites de memoria por pool de PHP-FPM. Edita el archivo de configuración del pool (ej. /etc/php/8.2/fpm/pool.d/www.conf) y añade:
php_admin_value[memory_limit] = 512MUsando php_admin_value esta configuración se vuelve inmutable — no puede ser sobreescrita por .user.ini o ini_set(). Esto es útil para aplicar límites en entornos multi-tenant.
Memoria Por Proceso vs Memoria Compartida
Es importante entender que memory_limit se aplica a cada proceso PHP individual, no a PHP en su conjunto. Si estableces memory_limit = 512M y tu servidor ejecuta 20 procesos PHP concurrentes, el consumo máximo teórico de memoria por parte de PHP es de 10GB (20 x 512MB).
Por esto, aumentar ciegamente el límite de memoria puede causar problemas. En un servidor con 4GB de RAM, establecer memory_limit = 1G con 10 workers PHP-FPM significa que PHP solo podría intentar usar 10GB, causando un intenso intercambio del sistema o activando el OOM killer de Linux, que termina procesos forzosamente para liberar memoria.
El enfoque correcto es equilibrar el límite de memoria con el número de workers PHP:
- RAM disponible para PHP = RAM total - overhead SO - memoria MySQL - memoria servidor web - otros servicios
- Workers PHP máximos = RAM disponible para PHP / memory_limit
Por ejemplo, en un VPS de 4GB: 4GB totales - 0,5GB SO - 1GB MySQL - 0,25GB Nginx = 2,25GB para PHP. Con memory_limit = 256M, puedes ejecutar de forma segura 8-9 workers PHP-FPM. Con memory_limit = 512M, solo puedes ejecutar 4 workers, lo que significa que se pueden atender menos solicitudes concurrentes.
Configura el pool PHP-FPM en consecuencia:
pm = dynamic
pm.max_children = 8
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5Diagnosticar Fugas de Memoria y Uso Excesivo
Si aumentar el límite de memoria solo retrasa el error en lugar de solucionarlo, probablemente tienes una fuga de memoria o un proceso ineficiente. Aquí te mostramos cómo diagnosticar la causa raíz.
Habilitar el Modo Debug de PrestaShop
Edita config/defines.inc.php y establece:
define('_PS_MODE_DEV_', true);Esto habilita la información detallada de errores, incluyendo el archivo exacto y el número de línea donde se excedió el límite de memoria. La traza de pila muestra la cadena de llamadas a funciones que llevaron al error, ayudándote a identificar el módulo o la función core responsable.
Monitorear el Uso de Memoria en el Código
Puedes añadir monitoreo de memoria a secciones específicas del código para identificar dónde ocurren los picos de memoria:
error_log('Memoria antes de la operación: ' . memory_get_usage(true) / 1024 / 1024 . ' MB');
// ... operación ...
error_log('Memoria después de la operación: ' . memory_get_usage(true) / 1024 / 1024 . ' MB');
error_log('Pico de memoria: ' . memory_get_peak_usage(true) / 1024 / 1024 . ' MB');La función memory_get_usage(true) devuelve la cantidad real de memoria asignada por el SO a PHP, mientras que memory_get_peak_usage(true) devuelve la cantidad máxima asignada en cualquier punto durante la solicitud.
Usar el Profiling de Xdebug
El profiler de Xdebug genera informes detallados de llamadas a funciones, tiempo de ejecución y consumo de memoria. Habilítalo temporalmente en tu configuración PHP:
xdebug.mode = profile
xdebug.output_dir = /tmp/xdebugAbre los archivos cachegrind generados en una herramienta como KCacheGrind o Webgrind para visualizar qué funciones consumen más memoria. Este es el enfoque diagnóstico más exhaustivo, pero solo debería usarse en servidores de desarrollo debido a la significativa sobrecarga de rendimiento.
Verificar Consultas Lentas y MySQL
A veces lo que parece ser un problema de memoria PHP es en realidad un problema de MySQL. Una consulta lenta que devuelve millones de filas hará que PHP asigne memoria para todo el conjunto de resultados. Verifica el log de consultas lentas de MySQL:
sudo tail -100 /var/log/mysql/slow-query.logSi ves consultas con conjuntos de resultados grandes, añade cláusulas LIMIT apropiadas o implementa paginación en el módulo responsable.
Memoria OPcache
OPcache es una extensión PHP que almacena en caché el bytecode PHP compilado en memoria compartida, eliminando la necesidad de analizar y compilar los archivos PHP en cada solicitud. OPcache tiene su propia asignación de memoria, separada de memory_limit.
La memoria predeterminada de OPcache (opcache.memory_consumption) es 128MB. PrestaShop con varios módulos instalados puede superar fácilmente esto. Cuando OPcache se queda sin memoria, comienza a expulsar entradas en caché y recompilar archivos en cada solicitud, causando una degradación significativa del rendimiento.
Verifica el estado de OPcache desde la línea de comandos:
php -r "print_r(opcache_get_status());"O mira la sección opcache en tu salida de phpinfo(). Valores clave a monitorear:
- opcache.memory_consumption: Memoria total asignada para OPcache (aumenta a 256M para PrestaShop)
- opcache.max_accelerated_files: Número máximo de archivos que OPcache puede almacenar en caché (aumenta a 20000 para PrestaShop)
- Memoria usada vs Memoria libre: Si la memoria libre está cerca de cero, aumenta
memory_consumption - Tasa de aciertos de caché: Debería ser superior al 99%. Por debajo del 95% indica presión de memoria o invalidación frecuente de caché
Configuración de OPcache recomendada para PrestaShop:
opcache.enable = 1
opcache.memory_consumption = 256
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 0
opcache.interned_strings_buffer = 16Ten en cuenta que la memoria de OPcache es compartida entre todos los procesos PHP, a diferencia de memory_limit que es por proceso. Aumentar la memoria de OPcache no se multiplica por el número de workers.
Configuración de Memoria MySQL
MySQL tiene su propia configuración de memoria que afecta indirectamente al rendimiento de PrestaShop y puede contribuir a la presión general de memoria del servidor. Las principales configuraciones de memoria de MySQL incluyen:
- innodb_buffer_pool_size: El buffer de memoria principal para las tablas InnoDB. Establece al 50-70% de la RAM disponible en un servidor de base de datos dedicado, o al 25-50% en un servidor compartido que ejecuta tanto PHP como MySQL. Esta es la configuración de rendimiento de MySQL más importante.
- sort_buffer_size y join_buffer_size: Buffers por conexión para ordenamiento y uniones. Mantén estos en sus valores predeterminados a menos que tengas consultas lentas específicas que se beneficien de buffers más grandes. Establecerlos demasiado altos desperdicia memoria porque se asignan por conexión.
- query_cache_size: Obsoleto en MySQL 8.0 y eliminado completamente. Si todavía estás en MySQL 5.7, una caché de consultas pequeña (64M) puede ayudar, pero cachés grandes causan contención y reducen el rendimiento.
Si MySQL consume demasiada memoria, queda menos para PHP, lo que potencialmente te obliga a reducir los workers PHP-FPM o el límite de memoria. Usa mysqladmin status o SHOW GLOBAL STATUS para monitorear el consumo de memoria de MySQL.
Cuándo Actualizar Tu Hosting
A veces aumentar el límite de memoria y optimizar el código no es suficiente. Aquí están las señales de que necesitas un servidor más potente:
- Constantemente alcanzas el límite de memoria máximo: Si tus procesos utilizan regularmente el 90%+ de la memoria asignada, incluso después de la optimización, necesitas más RAM.
- El servidor intercambia frecuentemente: Verifica con
free -hovmstat 1. Si el uso de swap es consistentemente alto, no tienes suficiente RAM física. - Reducir los workers PHP está perjudicando el rendimiento: Si tuviste que reducir los workers PHP-FPM a 3-4 para acomodar el límite de memoria, tu sitio no puede manejar visitantes concurrentes efectivamente.
- Tu catálogo sigue creciendo: Una tienda que funcionaba bien con 1.000 productos puede tener dificultades con 10.000. Las necesidades de memoria escalan con el tamaño del catálogo, especialmente para la indexación de búsqueda, el listado de categorías y las operaciones del back office.
- Necesitas memory_limit superior a 1G: Si un único proceso PHP necesita más de 1GB de memoria para operaciones normales (no importaciones), algo está fundamentalmente mal en tu código o en la capacidad de tu hosting. Investiga la causa raíz antes de continuar aumentando el límite.
Al actualizar, prioriza más RAM sobre más núcleos de CPU para PrestaShop. Un servidor con 8GB de RAM y 2 núcleos servirá mejor a PrestaShop que uno con 4GB de RAM y 4 núcleos. También considera separar MySQL en su propio servidor o usar un servicio de base de datos gestionado, lo que libera completamente la RAM del servidor de aplicaciones para PHP.
Referencia Rápida: Configuraciones Recomendadas por Tamaño de Tienda
Las siguientes recomendaciones sirven como puntos de partida. Monitorea tu uso real y ajusta en consecuencia.
- Tienda pequeña (menos de 1.000 productos, pocos módulos):
memory_limit = 256M, 2GB RAM, 4-6 workers PHP - Tienda mediana (1.000-10.000 productos, 20+ módulos):
memory_limit = 512M, 4GB RAM, 6-8 workers PHP - Tienda grande (10.000+ productos, muchas combinaciones):
memory_limit = 512M-1G, 8GB+ RAM, 8-16 workers PHP, servidor de base de datos separado - Durante importaciones: Aumenta temporalmente a
1Go2G, luego restaura el valor normal
Recuerda que el límite de memoria es un techo de seguridad, no un objetivo. Una tienda PrestaShop bien optimizada debería rara vez usar más de 128-256MB por solicitud durante las cargas de página normales. Si las operaciones normales necesitan constantemente 512MB o más, investiga y soluciona la causa subyacente en lugar de continuar aumentando el límite.
¿Le resultó útil esta respuesta?
¿Aún tiene preguntas?
Can't find what you're looking for? Send us your question and we'll get back to you quickly.