PHP memory_limit o por qué es importante mantener este valor bajo


#1

1. Introducción

El siguiente artículo explica porque es importante mantener un memory_limit y un max_execution_time bajos para controlar dos de los principales problemas del código desarrollo con php sobre todo para motores de gestión de contenidos genéricos como Wordpress y Prestashop.

2. Por qué son importantes estas configuraciones

Respuesta corta: si se usan valores altos, la web será mucho más atacable, frágil y dará una peor respuesta a los usuarios.

La razón algo más extendida tiene que ver con la programación PHP, cómo se usa para combinar poderosas abstracciones de composición y extensión, habitualmente utilizados por productos como Wordpress, Prestashop y similares, permitiendo la ampliación de los mismos, sus características, y temas, de una manera muy sencilla y desacoplada en términos de código.

Sin embargo, el problema viene cuando el desarrollo de código php, plugins, y motores genéricos como el wordpress donde existe una tendencia por parte de los programadores a no prestar mucha atención a los detalles de consumo de memoria.

Esto hace que existan amplios listados de fallos conocidos que si son llamados de manera sencilla con ciertos parámetros, consigues que la web consuma memoria sin límite.

Eso es un problema ya que hace que la web sea frágil ante ataques sencillos: con pocas llamadas url y similares un potencial atacante puede conseguir que la web lance procesos muy grandes y pesados que ocupan mucha, y a veces toda la memoria, dejando fuera al visitante o incluso al propio servidor (OOM, out-of-memory).

3. De ahí surgen configuraciones como el memory_limit

Para limitar estos problemas el motor php tiene dos grandes configuraciones (hay muchas más), pero estas dos permiten entender bien su utilidad y son de las principales:

  • memory_limit : limitar el consumo de memoria de manera que para una visita normal, no se deberían necesitar 768MB. De este modo las visitas normales entran, y los ataques que desencadenan consumos de memoria altos, fallan al alcanzarse el límite habitual (128MB o 256MB).

  • max_execution_time : limitar el tiempo que está un proceso php en funcionamiento. Si no se limita, una atacante podría lanzar consultas que causasen que el motor php se quede esperando sin terminar, echando a otros visitantes. De ahí que se limite a 30 segundos o menos.

IMPORTANTE: Estos límites están para asegurarse que las visitas de clientes y usuarios entran, haciendo más difícil al atacante congestionar la web o hacerla que consuma muchos recursos.

Para el caso del memory_limit, un valor de 256MB ya se considera muy elevado: con 4 visitas ya consumes 1GB, de manera que la web con muy pocos accesos puede consumir varios GB de memoria provocando lentitud, aumentando las posibilidades de rechazar visitas normales, y también se hace posible que se tire el servidor por OOM-killer (evento que se lanza cuando ya no hay más memoria y el kernel intenta resolverlo desalojando procesos por la fuerza).

4. Valores de memory_limit para entornos de producción

Por este motivo 512MB o 768MB son valores fuera de rango y no son aptos para producción.

Los valores recomendados siempre serán 256MB o lo menos posible (128MB o 64MB).

5. ¿Qué soluciones hay si no puedo bajarlo?

En algunos casos, como el de Wordpress+Elementor se encuentran escenarios de altísimo consumo de memoria al editar la página.

En estos casos, una opción es subir este memory_limit temporalmente mientras realizáis cambios, y a continuación lo podemos bajar a 256MB (o lo menos posible) para que la web tenga un mejor comportamiento tras terminar el mantenimiento.

6. Como cambiar el memory_limit con Core-Admin

Es una opción de administrador. Usa el Gestor de alojamientos para localizar el alojamiento en cuestión, navegar al menú de Opciones del sitio y dentro actualizar convenientemente el valor de memory__limit:

RECUERDA: no lo dejes alto o harás que la web sea mucho más atacable!

7. Relacionados