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\nLa 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\nEl 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\nEn 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).
Puede verificar el límite actual así:
\n\n<?php\necho ini_get('memory_limit'); // Muestra, por ejemplo, "128M"\n?>\n\nCuando 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\nEscenarios 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
Cómo corregir el error: 3 métodos comprobados
\n\n1. Aumento temporal del límite mediante ini_set()
\n\nLa 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\nImportante: esto solo funcionará si su alojamiento permite sobrescribir la directiva. En algunos alojamientos, ini_set() para memory_limit está bloqueado.
\n\n2. Modificación de php.ini o .htaccess
\n\nSi tiene acceso al servidor, edite php.ini:
memory_limit = 256M\n\nO mediante .htaccess (en Apache):
php_value memory_limit 256M\n\nDespués de los cambios, reinicie el servidor web o PHP-FPM.
\n\n3. Optimización del código — la mejor solución
\n\nAumentar el límite es un parche. La verdadera solución es escribir código eficiente. Analicemos ejemplos.
\n\nEjemplo real: procesamiento de un archivo CSV grande
\n\nSupongamos 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\nCon un archivo de 200 MB, el script fallará con un error de memoria.
\n\nOptimizació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\nAhora el script usa solo unos pocos megabytes, independientemente del tamaño del archivo.
\n\n<