Error de memoria PHP: cómo solucionar el límite de 128 MB

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

«Allowed Memory Size of 134217728 Bytes Exhausted» – el freno de emergencia de tu aplicación PHP

\n\n

¿Alguna vez has visto este mensaje en medio de la noche, cuando tu sitio web se cae inesperadamente y en los logs aparece un texto blanco sobre fondo negro? Si es así, no estás solo. Miles de desarrolladores en Stack Overflow se han preguntado por qué su script PHP, aparentemente inofensivo, de repente consume todos los 128 megabytes de RAM y falla con un error fatal.

\n\n

Vamos a entender qué significa realmente este error, por qué ocurre y, lo más importante, cómo solucionarlo de una vez por todas. No solo aumentaremos el límite de memoria, sino que aprenderemos a escribir código que no devore recursos como un estudiante hambriento en la cafetería.

\n\n

¿Qué significa «134217728 Bytes Exhausted»?

\n\n

El número 134,217,728 son 128 megabytes. Esa es la cantidad de memoria que PHP permite usar a tu script por defecto. Cuando el script intenta asignar más – ¡pum! – y obtienes un Fatal Error. Es un mecanismo de protección que evita que un solo script derribe todo el servidor.

\n\n

Pero aquí está el truco: 128 MB es muy poco para las aplicaciones modernas. Procesar un archivo XML grande, generar un informe desde la base de datos, trabajar con imágenes o librerías pesadas – todo esto puede superar fácilmente el límite.

\n\n

¿Por qué ocurre esto? Tres causas principales

\n\n
    \n
  • Bucles voraces y recursión – cuando cargas todos los datos en memoria de una vez, en lugar de procesarlos por partes.
  • \n
  • Fugas de memoria – variables estáticas, arrays globales y el uso incorrecto de static pueden acumular datos.
  • \n
  • Librerías y extensiones pesadas – por ejemplo, procesamiento de imágenes con GD o trabajo con PDF.
  • \n
\n\n

Cómo solucionar el error: de lo simple a lo complejo

\n\n

Método 1: Aumentar el límite de memoria (solución rápida)

\n\n

La forma más obvia es simplemente darle más memoria a PHP. Pero recuerda: esto no es una cura, es un analgésico. Si tu código está mal escrito, consumirá 512 MB y hasta 1 GB.

\n\n

Hay tres formas de aumentar el límite:

\n\n

1. En el archivo php.ini (cambio permanente):

\n
memory_limit = 256M
\n\n

2. En .htaccess (si está disponible):

\n
php_value memory_limit 256M
\n\n

3. En el propio script (solo para la ejecución actual):

\n
ini_set('memory_limit', '256M');
\n\n

Pero te advertimos: si estás en un hosting compartido, el proveedor puede no permitir aumentar el límite por encima de cierto umbral. E incluso si lo permite, no abuses.

\n\n

Método 2: Optimización del código – la solución real

\n\n

En lugar de darle más memoria al script, enseñémosle a usar lo que tiene de forma inteligente.

\n\n

Usa unset() para liberar memoria

\n\n

PHP no es C++, pero la gestión manual de memoria sigue funcionando. Cuando una variable grande ya no es necesaria, elimínala:

\n\n
$data = file_get_contents('archivo_gigante.csv');\n// procesamos los datos\nprocessData($data);\n// liberamos memoria\nunset($data);\n
\n\n

Procesa los datos por partes

\n\n

En lugar de cargar 100,000 filas de la base de datos en memoria, usa cursores o límites:

\n\n
// MAL: cargamos todo en memoria\n$users = $db->query("SELECT * FROM users")->fetchAll();\n\n// BIEN: procesamos fila por fila\n$stmt = $db->query("SELECT * FROM users");\nwhile ($row = $stmt->fetch()) {\n    processUser($row);\n    // PHP libera memoria después de cada iteración\n}\n
\n\n

Usa generadores (yield)

\n\n

Los generadores son magia para trabajar con grandes conjuntos de datos. No almacenan todos los valores en memoria:

\n\n
function getLargeData() {\n    for ($i = 0; $i < 1000000; $i++) {\n        yield $i;\n    }\n}\n\nforeach (getLargeData() as $value) {\n    // procesamos un elemento a la vez\n    echo $value . "\\n";\n}                

Blogs

Book Recommendations