Cómo solucionar el error «Ha habido un error crítico en esta web» que puede aparecer a veces al cargar nuestra web en WordPress. Internamente el error que se produce es: PHP Fatal error: Allowed memory size of … bytes exhausted (tried to allocate … bytes). También explicamos cómo activar el modo de depuración (debug) de WordPress y cómo consultar el fichero de log debug.log.
- El error, cuándo se produce, motivo.
- Activar el modo debug en WordPress.
- Consultar el fichero de log y analizar los posibles errores en WordPress.
- Solución al error PHP Fatal error: Allowed memory size of … bytes exhausted (tried to allocate … bytes).
El error, cuándo se produce, motivo
Cuando tenemos una web con WordPress y alguno de los plugins que tenemos activos requieren del uso de mucha memoria, o bien que la web tenga muchísimas visitas concurrentes, se puede producir un consumo de memoria de PHP alto. Si las necesidades de memoria sobrepasan los límites establecidos se producirá, en la web, el error:
Ha habido un error crítico en esta web
El error es muy genérico y no aporta nada de información, puesto que se muestra a todos los usuarios que naveguen en nuestra web. Por lo tanto, es lógico que por seguridad no muestre más información.
Para depurar el error real que se produce y el motivo, habrá que activar el modo debug en WordPress. A continuación explicamos cómo hacerlo.
Activar el modo debug en WordPress
Existen varias opciones para activar el modo debug en WordPress. Una de las más rápidas y eficientes es modificar el fichero wp-config.php que estará en la raíz de nuestra web. Lo editaremos y agregaremos las siguientes líneas (al final, por ejemplo):
1 2 3 4 |
define('WP_DEBUG', true); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false ); @ini_set( 'display_errors', 0 ); |
Puede que el fichero ya contenga alguna de estas líneas, si es así comprobaremos que esté igual y dejaremos una de ellas. Guardaremos los cambios en el fichero wp-config.php y, a partir de ahora, WordPress escribirá cualquier warning, aviso o error que se produzca en nuestra web en el fichero:
/www/wp-content/debug.log
Con las líneas anteriores indicamos a WordPress que guarde los posibles errores que se produzcan en el fichero debug.log y que NO los muestre por pantalla. Esto es muy recomendable para no mostrar información sensible al usuario que navegue a nuestra web. Evidentemente, si estamos desarrollando la web y aún no ha sido publicada, podremos cambiar las líneas:
1 2 |
define( 'WP_DEBUG_DISPLAY', false ); @ini_set( 'display_errors', 0 ); |
Por:
1 2 |
define( 'WP_DEBUG_DISPLAY', true ); @ini_set( 'display_errors', 1 ); |
De esta forma mostraría los errores por pantalla también.
Consultar el fichero de log y analizar los posibles errores en WordPress
Una vez que tenemos activado el modo debug, podremos descargarnos o leer directamente el fichero:
/www/wp-content/debug.log
Que tendrá un contenido similar al siguiente:
En función del nivel de log, nos mostrará los Warning, los Notice o los errores o todos ellos. En nuestro caso nos mostrará todos los niveles de log. Nos centraremos principalmente en las líneas que empiecen por «PHP Fatal error» o bien «Error». Y sobre todo los «PHP Fatal error», que son los que pueden producir que la web no se muestre al usuario.
El nivel de error, ordenado por gravedad, de menor a mayor, sería:
- PHP Notice: información sobre líneas de código que puedan no estar bien construidas y alguna otra información que no es motivo de error. Por ejemplo:
1 |
[27-Apr-2021 18:35:59 UTC] PHP Notice: WP_Scripts::localize ha sido llamada de forma incorrecta. El parámetro $l10n debe ser un array. Para pasar datos arbitrarios a los scripts, usa en su lugar la función wp_add_inline_script(). |
- PHP Deprecated: posibles estructuras de código que contienen funciones obsoletas, que se mantienen en versiones de PHP nuevas únicamente por compatibilidad. Por ejemplo:
1 |
[27-Apr-2021 18:37:55 UTC] PHP Deprecated: class-oembed.php ha quedado obsoleto desde la versión 5.3.0. Utiliza wp-includes/class-wp-oembed.php en su lugar. in /usr/home/proyectoa/www/wp-includes/functions.php on line 5051 |
- PHP Warning: avisos de alguna línea de código que produce errores de compilación, no son errores graves. Por ejemplo:
1 |
[27-Apr-2021 18:38:27 UTC] PHP Warning: Invalid argument supplied for foreach() in /usr/home/proyectoa/www/wp-content/plugins/lightbox/lightbox.php on line 211 |
- PHP Fatal error: se trata de un error grave que hará que la web no se cargue. A continuación mostramos un ejemplo, que es, precisamente, el error que analizaremos en este tutorial:
1 |
[27-Apr-2021 18:58:21 UTC] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65536 bytes) in /usr/home/proyectoa/www/wp-includes/wp-db.php on line 2056 |
- Error: errores que se producen en la carga del sitio web WordPress. Por ejemplo cuando falta alguna tabla. Normalmente estos errores permiten seguir cargando la web, con alguna sección o plugin que deje de funcionar. Por ejemplo:
1 |
[27-Apr-2021 18:38:20 UTC] Error Table 'wp_ahm_user_download_counts' doesn't exist de la base de datos de WordPress para la consulta select download_count from wp_ahm_user_download_counts WHERE user = '192.168.1.225' and package_id = '41733' realizada por require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), include('/themes/Extra/index.php'), get_sidebar, locate_template, load_template, require_once('/themes/Extra/sidebar.php'), dynamic_sidebar, WP_Widget->display_callback, WPDM_NewDownloads->widget, wpdm_fetch_template, WPDM\Package::fetchTemplate, WPDM\Package->prepare, WPDM\Package::userDownloadLimitExceeded, WPDM\libs\DownloadStats->userDownloadCount |
Hay otros niveles de errores pero estos son los más importantes.
Solución al error PHP Fatal error: Allowed memory size of … bytes exhausted (tried to allocate … bytes)
Como hemos comentado al principio, este error se produce por falta de memoria asignada a PHP. Alguno de los plugins de WordPress que tenemos activos necesita más memoria de la permitida. Esto produce un error fatal (como hemos indicado anteriormente) y la web no cargará al usuario, únicamente le mostrará una página en blanco con el mensaje:
Ha habido un error crítico en esta web
Para solucionar este error tendremos dos opciones:
- La primera será intentar averiguar qué plugin está consumiendo memoria de PHP, para verificar que su comportamiento es correcto. En este caso, si el plugin es correcto y requiere de más memoria, no quedará más remedio que ampliarla. Y si se trata de un plugin que está generando un comportamiento erróneo tendremos que desactivarlo y buscar una solución.
- La segunda es ampliar el límite de memoria asignada a PHP. Esto puede hacerse de varias formas, como explicamos a continuación.
Ampliar límite de memoria para PHP desde la línea de comandos
El mejor método es modificar el fichero php.ini. Si tenemos acceso a la línea de comandos de nuestro servidor web con usuario con privilegios suficientes, únicamente tendremos que editar el fichero /etc/php.ini, por ejemplo con nano:
nano /etc/php.ini
(en servidores Linux suele estar en /etc, en servidores Windows suele estar en C:\Windows\System32)
Buscaremos la línea: memory_limit y ampliaremos su valor. No debemos excedernos, dado que PHP podría consumir más memoria de la disponible en el sistema y generar un cuelgue del equipo completo. Por lo tanto es conveniente ir aumentando este valor poco a poco, hasta comprobar que ya no se produce el error. Por ejemplo, si tenemos 64M, podremos ampliarlo a casi el doble, a 124M:
memory_limit=124M
Guardaremos los cambios pulsando Control + W y cerraremos pulsando Control + X.
Ahora tendremos que reiniciar el servicio de Apache para que el cambio se aplique. En función del sistema operativo lo haremos de una forma u otra, para un equipo Linux CentOS:
service httpd restart
Ampliar límite de memoria para PHP desde el fichero .htaccess
Si tenemos acceso al fichero .htaccess de nuestro sitio web, que suele estar en el raíz, podremos editarlo y añadir la línea:
php_value memory_limit 124M
Ampliar límite de memoria para PHP desde el código PHP
Otra forma posible de ampliar el límite de memoria de PHP es desde el propio código PHP, agregando:
1 2 3 |
<?php ini_set('memory_limit', '128M'); ?> |
Aunque hay que tener en cuenta que no todos los servidores permiten realizar este cambio desde el código PHP. Todo irá en función del nivel de restricciones que tengamos.
Sin duda, el mejor método y más eficiente es modificar el fichero de configuración de php, /etc/php.ini, como hemos indicado aquí.
Con esta ampliación de memoria debería de dejar de producirse el error fatal y nuestra web cargará correctamente. Si sigue produciéndose, habrá que volver a aumentar otro poco este valor.
Una vez que tengamos solucionado el error es conveniente volver a desactivar el modo debug, pues solo es recomendable activarlo cuando queramos depurar algún error. Para desactivarlo será suficiente con cambiar la línea del fichero wp-config.php:
1 |
define('WP_DEBUG', true); |
Por:
1 |
define('WP_DEBUG', false); |