PHP Fatal Error: Allowed Memory Size — derribamos mitos y configuramos

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

Introducción: ¿por qué su script PHP «explota»?

\n\n

¿Alguna vez ha visto en la pantalla un lienzo blanco con la escalofriante frase «Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted»? Si es así, no está solo. Esta pregunta en Stack Overflow ha acumulado miles de visitas, y uno de cada dos desarrolladores PHP se ha topado con ella al menos una vez en la vida.

\n\n

La cifra 134217728 bytes son exactamente 128 megabytes (el límite estándar para muchos alojamientos). Cuando su script intenta ocupar más, PHP dice «alto» y lanza un error fatal. ¡Pero no se apresure a entrar en pánico! En este artículo analizaremos por qué ocurre, cómo solucionarlo y, lo más importante, cómo optimizar el rendimiento para que el error de memoria ya no le preocupe.

\n\n

El artículo está escrito para el sitio educativo PythonLib, pero todo el código y los ejemplos están en PHP. ¡Allá vamos!

\n\n

¿Qué es memory_limit y de dónde viene «134217728»?

\n\n

En PHP existe la directiva memory_limit, que establece la cantidad máxima de memoria disponible para un script. Por defecto, en muchas configuraciones (especialmente en alojamientos compartidos) el valor es 128M (o 134217728 bytes).

\n\n

Puede verificar el límite actual así:

\n\n
<?php\necho ini_get('memory_limit'); // Muestra, por ejemplo, "128M"\n?>
\n\n

Cuando su script supera este límite, PHP finaliza inmediatamente la ejecución con un error fatal. Las causas pueden ser diversas: desde código no óptimo hasta la carga de archivos gigantescos en memoria.

\n\n

Escenarios típicos que provocan el error

\n\n
    \n
  • Trabajo con arrays grandes — por ejemplo, leer un archivo CSV completo en memoria.
  • \n
  • Bucles con fugas — olvidar liberar variables o usar arrays globales.
  • \n
  • Bibliotecas de procesamiento de imágenes — GD o Imagick al trabajar con fotos de alta resolución.
  • \n
  • Funciones recursivas — sin una condición base, se vuelven infinitas y consumen la pila.
  • \n
  • ORM y caché — algunos ORM (por ejemplo, Doctrine) pueden cargar toda la tabla en memoria.
  • \n
\n\n

Cómo corregir el error: 3 métodos comprobados

\n\n

1. Aumento temporal del límite mediante ini_set()

\n\n

La forma más rápida es aumentar el límite directamente en el script:

\n\n
<?php\nini_set('memory_limit', '256M');\n// Ahora el script puede usar hasta 256 MB\n?>
\n\n

Importante: esto solo funcionará si su alojamiento permite sobrescribir la directiva. En algunos alojamientos, ini_set() para memory_limit está bloqueado.

\n\n

2. Modificación de php.ini o .htaccess

\n\n

Si tiene acceso al servidor, edite php.ini:

\n\n
memory_limit = 256M
\n\n

O mediante .htaccess (en Apache):

\n\n
php_value memory_limit 256M
\n\n

Después de los cambios, reinicie el servidor web o PHP-FPM.

\n\n

3. Optimización del código — la mejor solución

\n\n

Aumentar el límite es un parche. La verdadera solución es escribir código eficiente. Analicemos ejemplos.

\n\n

Ejemplo real: procesamiento de un archivo CSV grande

\n\n

Supongamos que tiene un archivo CSV con 500 000 líneas. Un código ingenuo podría verse así:

\n\n
<?php\n$rows = file('data.csv'); // ¡Carga TODO el archivo en memoria!\nforeach ($rows as $row) {\n    // procesamiento\n}\n?>
\n\n

Con un archivo de 200 MB, el script fallará con un error de memoria.

\n\n

Optimización: lectura línea por línea

\n\n
<?php\n$handle = fopen('data.csv', 'r');\nif ($handle) {\n    while (($row = fgetcsv($handle)) !== false) {\n        // procesamos una línea a la vez\n        // la memoria casi no crece\n    }\n    fclose($handle);\n}\n?>
\n\n

Ahora el script usa solo unos pocos megabytes, independientemente del tamaño del archivo.

\n\n<

Blogs

Book Recommendations