Uno de los errores que más a menudo me llegan a través de mi servicio de resolución de emergencias WordPress es el error Fatal error: Allowed memory size of N bytes exhausted. Es un error bastante común, que incluso quizá se te haya presentado en alguna ocasión.
La solución a este problema es bastante sencilla, y consiste en aumentar el límite de memoria, ya que el error es causado por un consumo de memoria que excede a la cantidad disponible. Vamos a ver por qué se produce y cómo solucionarlo cuando se nos presente.
Tabla de contenidos
Causas del error Fatal error: Allowed memory size…
Antes de nada, estoy seguro de que sabes de lo que estamos hablando (de hecho si estás leyendo esto es muy probable que lo hayas sufrido recientemente), pero para que todo el mundo pueda verlo, la consecuencia del este error es ésta:
Así, sin más. Sin que haya habido cambios evidentes que justifiquen un error cuando antes todo funcionaba correctamente, y que se muestra de forma aparentemente aleatoria. ¿Por qué ocurre esto?
Ya sabes que WordPress está hecho en PHP, un lenguaje de programación que no se compila (no se crea un .exe ni un .jar ni ningún otro tipo de ejecutable) sino que se interpreta: los archivos .php están en el servidor y cada vez que alguien hace una petición, el servidor los lee y ejecuta esa petición en función de las órdenes que hay en esos archivos.
¿Suena muy técnico? Bueno, tampoco lo es tanto. La idea que se te tiene que quedar es ésta: cada vez que el servidor tiene que realizar cualquier operación por medio de WordPress (mostrar una web, enviar un formulario, dar de alta un cliente, instalar un plugin… ¡cualquier cosa!) necesita realizar una serie de operaciones, indicadas en los archivos PHP de WordPress.
Y ¿qué ocurre? Pues que en ocasiones, dependiendo de qué operaciones sean ésas, de cómo esté configurado el servidor y de cómo indique el código que deben hacerse, es posible que el servidor se encuentra con que no puede disponer de la memoria que necesita para realizar dicha operación.
Y entonces hace lo único que un servidor sabe hacer cuando se encuentra un error fatal: parar en seco y pedir ayuda. De ahí ese agónico grito de:
Fatal error: Allowed memory size of 1043576 bytes exhausted (tried to allocate 122688 bytes) in /ruta/web/dominio.com/wp-includes/functions.php on line 188
Que, traducido a algo que todos podamos entender, viene a decir algo así como:
Jod… Recórcholis, me han hecho falta un chorro de bytes de memoria para realizar la instrucción de la línea tal del archivo cual.php, pero no dispongo de tantos, así que aquí me quedo
Más o menos vendría a ser algo así. Como te puedes imaginar, no es un error exclusivo de WordPress, sino que puede generarlo cualquier software en PHP.
Factores que inciden en este error
Como ves, es simplemente un caso de falta de memoria, como cuando abres el Photoshop, el Skype, el eMule, tres hojas de Excel, dos PowerPoint que te ha mandado tu prima y el Adera, mientras echas una partida al Candy Crash. Básicamente es lo mismo.
Este error parece tan aleatorio porque depende de muchas cosas. Una combinación de ellas puede causarlas en una web, y no en otra con la misma configuración y el mismo contenido que esté en otro servidor. Entre los factores que influyen están:
- La configuración del servidor
- La carga que soporta dicho servidor
- El uso de un sistema de caché
La configuración del servidor
Claramente, si el problema se produce por falta de memoria necesaria, la cantidad de ésta que haya disponible influye y mucho en que se produzca o no el Fatal error Allowed memory size.
Tampoco es lo mismo si el servidor es compartido o dedicado. Claro, un servidor dedicado es mucho más caro, pero sólo lo usas tú. No es lo mismo disponer de toda la capacidad del servidor para tu web, que tener que compartir esa capacidad con veinte webs de las de cien mil visitas diarias.
La carga que soporta el servidor
Y eso nos lleva al siguiente tema. Porque claro, no es lo mismo una web con tres visitas concurrentes que otra en la que en cualquier momento dado hayan diez mil peticiones. Por supuesto el servidor necesita muchos más recursos en el segundo caso que en el primero.
Y tampoco, atención, es lo mismo una web con cien plugins activos y una plantilla comprada en Theme Forest, que hará que el servidor sude la gota gorda, que una con pocos plugins, bien programados, y un eficiente child theme de Genesis. Así que ya sabes.
La caché
Un sistema de caché evita la reiteración de peticiones al servidor. Lo que hace es que, si a una web llegan cien visitas a ver una misma página, el servidor generará esa página siguiendo las instrucciones de los archivos PHP correspondientes sólo una vez, y la guardará en formato HTML. Las otras 99 personas verán ese HTML, lo que hace que el servidor ahorre muchos recursos.
Sin embargo a veces los sistemas de caché no son adecuados. Precisamente la característica de PHP es que genera los contenidos de forma dinámica, pudiendo personalizarlos. ¿De qué nos sirve entonces que genere un PHP estático? Además, siempre tendrá que generarlo esa primera vez…
¿Estás construyendo tu tienda online o eres implementador WordPress?
¿Necesitas plugins de calidad y con soporte para implementar funcionalidades concretas?
Consigue todos los plugins a la venta en la sección de plugins de esta web y todos los que siga añadiendo. Acceso a los 96 plugins (y subiendo) con soporte directo del desarrollador, actualizaciones y uso ilimitado: úsalos en tantas webs como lo necesites.
Diagnóstico: ¿qué está causando el problema?
Y ahora que ya eres un pequeño experto en este error, sus causas y los factores que inciden en que se produzca, ya habrás podido inferir por ti mismo cuál es la solución para que no se produzca. Exacto: aumentar la memoria disponible para la ejecución de PHP. ¿O no?
Ojo con esto, porque no podemos liarnos la manta a la cabeza y empezar a dar megas al servidor: primero debemos saber cuál es la causa. Porque ¿y si el consumo excesivo de memoria lo está generando un plugin mal programado que entra en bucle?
Vale, es un caso extremo, pero ¿y si tenemos muchos plugins y un theme poco eficiente, que están solicitando demasiados recursos al servidor? Sí, aumentando la memoria disponible solucionaremos el error (al menos de momento) pero no evitará que nuestra web sea pesada, poco eficiente y, en general, lenta. Y este tipo de cosas hay que analizarlas.
¿Cuánta memoria disponible hay?
Así que vamos a empezar haciendo un diagnóstico, y lo primero que debemos saber es el estado del enfermo. Queremos saber, lo primero de todo, de cuánta memoria dispone el servidor.
Esto es muy sencillo de hacer. De hecho, vamos a obtener toda la información posible relativa a nuestro servidor y la instalación de PHP. Para eso basta subir por FTP un archivo al servidor (o crearlo en el directorio raíz) con el siguiente contenido:
<?php
phpinfo ();
?>
Solamente eso. ¿Qué hace? Bueno, phpinfo () es una función que muestra en pantalla la información sobre el estado actual de PHP y del servidor. Dale al archivo que quieras, por ejemplo info.php, y luego accede a él mediante tu navegador mediante la dirección http://www.tuwebsuperchula.com/info.php. Verás algo así:
Como verás, ahí hay muuuuucha información (lo que ves en la imagen de arriba es como la décima parte del contenido), pero lo que nos interesa es un valor llamado memory_limit, que establece el límite de memoria de que dispone nuestro servidor. No te quemes los ojos buscando, pulsa CTRL+F (CMD+F si estás en MacOS X) para abrir la función de búsqueda.
Ahí lo tienes: 128 MB en el caso de este ejemplo. Chafardea un poco si quieres entre la información (en la imagen ves que puedes encontrar otros valores interesantes, como el tamaño máximo de archivo permitido, el tiempo máximo de ejecución, etcétera) y después borra el archivo info.php o como lo hayas llamado. Elimínalo sin piedad. Esa información sería oro puro para alguien que pretendiera hacer daño a tu web.
128 megas. Eso es mucho. Atención, porque si tu memory_limit es de 128M y estás teniendo el error Fatal error: Allowed memory size es que algo está funcionando mal en tu web, puedes estar seguro. De todos modos, es más probable que encuentres valores más cercanos a 40-64M.
Solución al error Fatal error Allowed memory size: aumentar la memoria disponible para PHP
Muy bien, ya sabemos cuál es el problema y nos hemos asegurado de que no es de nuestra instalación (exceso de plugins o mala programación de alguno de ellos o del propio theme). Ahora viene la pregunta del millón: ¿cómo lo arreglo?
En realidad es muy sencillo, y de hecho se puede hacer de dos formas diferentes, ambas igual de fáciles y rápidas.
Aumentar la memoria disponible mediante el archivo .htaccess
La primera de ella pasa por modificar el archivo .htaccess, un archivo de configuración del servido.. Se trata de introducir un par de líneas, así que hay que abrir el archivo (se abre con cualquier editor de textos, haz copia de seguridad primero).
Este archivo está en la raíz (en el mismo directorio que las carpetas wp-admin, wp-content y wp-includes), aunque quizá si accedes desde el gestor de archivos de tu hosting no puedas verlo ya que los archivos y directorios cuyo nombre empieza por un punto son invisibles en muchos sistemas.
Así que si no lo ves (y aún viéndolo) lo mejor es editarlo accediendo mediante FTP. Si aún así tampoco lo ves busca la opción que te permita ver archivos invisibles en el programa que uses para acceder. En FileZilla la tienes en Servidor > Forzar mostrar archivos ocultos.
Bien, así que editas el archivo .htaccess y le añades:
php_value memory_limit 64M
¿Que si puedes añadir más? Pues sí, puedes añadir cualquier cantidad hasta copar la cuota que el hosting te permita, pero si te está dando el error por falta de memoria y lo tienes en 40M, mejor lo subes de momento a 64M. Ten en cuenta que si lo subes demasiado (128, 256) y es un plugin funcionando mal, vas a saturar los recursos del servidor y quizá desde el hosting te cierren cautelarmente la web hasta resolver el problema, ya que tu problema puede afectar seriamente a otras webs que estén alojadas en el mismo servidor.
Aumentar la memoria disponible mediante el archivo wp-config.php
La segunda solución pasa por editar el archivo de configuración de WordPress, el wp-config.php.
Se trata de algo similar: asignar a WordPress mayor cantidad de memoria, mediante su archivo de configuración. Simplemente lo abres (editor de textos, copia de seguridad primero) y añades una línea:
define ('WP_MEMORY_LIMIT', '64M');
Las recomendaciones son las mismas que antes: no hagas una barra libre de memoria. Si con 64M no se soluciona el problema, inténtalo (con mucha cautela) con 128M. Si aún así sigue dándote el error puedes volver a dejar la memoria en 64M y comenzar a buscar al culpable, porque sin duda hay alguno: un WordPress con 128M es capaz de mover WooCommerce, WPML, BuddyPress y varios plugins muy exigentes, incluso en combinación.
Conclusión
Si te has leído el artículo completo, a estas alturas ya debes ser un experto en gestión de memoria en PHP y WordPress 🙂
Si has ido directo al apartado con la solución y aún así sigues teniendo el problema, escríbeme mediante el formulario de contacto, quizá yo pueda ayudarte.
Y recuerda que la resolución de este tipo de incidencias están incluidas en mi servicio de mantenimiento y soporte técnico para WordPress.
jose dice
Hola enrique, tiempo sin hablar contigo. He estado siguiendo y aplicando todos tus videos y tutoriales. resulta que tengo un problemilla con mi pagina, resulta que he iniciado a subir productos y apenas he subido 4 y las imagenes no pesan mas de 80kb, pero hooo sorpresa me quede sin memoria ram, si antes cuando tenia las imagenes de woocomerce que eran mas de 20 no tenia ese problema y seguia subiendo productos y no pasaba nada, yo elimine estos productos y empece a subir los mios y walaaa ya no tengo memoria y como te digo las imagenes no pesan mas de 80 o 90 kb y mi pagina no tiene informacion adicional y por cada producto solo subo de imagenes mas.
No se realmente que ha sucedido. me pordrias brindar un poco de ayuda en este caso.
Enrique J. Ros dice
Hola Jose
Si es un problema de memoria (ayudaría bastante saber cuál es el error que te da) el tamaño y cantidad de las imágenes que subas es independiente. Si es un problema de espacio (ahí sí tienen que ver las imágenes subidas) habrá que ver qué es lo que lo está causando, ya que si imágenes con de ese rango de peso no lo justificaría. En estos casos el culpable suele ser un plugin de backup mal configurado, que está acumulando unos backups dentro de otros.
Un saludo.
Alex dice
Hola,
Gracias por el articulo estuvo muy bien explicado pero tengo la duda que pasa si la memoria de PHP tengo 512M
y sigo con el erro. De plano vendría ser mala programación o plugin mal programado pero como identificar en el caso de mala programación? hay alguna herramienta o por lo menos algún log o registro en la cual pueda indicarme donde se encuentra el problema con precisión?
Espero me pueda ayudar.
Gracias,
Enrique J. Ros dice
Hola Alex
Sí, si con 512M te sigue tirando el error es muy probable que algún proceso esté desbocado. Desactiva todos los plugins por FTP (basta cambiar el nombre a la carpeta plugins por cualquier otro, por ejemplo _plugins) y prueba. Si así puedes acceder tendrás que comenzar a probar uno a uno a ver qué plugin es el causante.
Un saludo.
EDUARD dice
YO TENGO SIEMPRE ESTE ERRO Y SE SOLUCIONA REINICIANDO EL SERVIDOR APACHE, PERO ES MOLESTOSO SOLO TENGO WOOCOMERCE Y WORDPRESS. ALGUNA RECOMENDACION ANTE ESTE ERROR
Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 2382364819 bytes) in D:ultranetxampphtdocswp-includesfunctions.php on line 5217
Enrique J. Ros dice
Veo que es en XAMPP, así que la solución es, seguramente, más RAM
eduard dice
muchas gracias
Norberto dice
Hola Enrique,
Tuve este problemita justamente «functions.php on line 5217» y así llegué a tu post.
Uso un WAMPP, reinicé el WAMP y nada, bajé algunos procesos para intentar liberar memoria y bajé un par de plugins.
Finalmente mi sitio respondió pero muy lento y cuando veo el procesador se mantiene al 100% en casi todo el tiempo memoria 60-70%, el httpd de apache es el que se consume casi todo mi procesador (2 procesadores virtuales 3.00Ghz) alguna idea por dónde revisar para reducir este consumo de recursos?
Enrique J. Ros dice
Hola Norberto
Claro, ¿has revisado ya la línea 5217 del functions.php?
Un saludo
Nurys dice
Que tiene de m malo si le asignó mucha memoria??
Ejemplo si le pongo: php_value memory_limit 9999M
..o hay alguna recomendación de no asignarle más de 512M por ejemplo?
Mi web es un ecommerce siempre tiene varios usuarios simultáneos y se pone lenta a veces.