Pantalla blanca de la muerte: error grave: tamaño de memoria permitido de X bytes agotado

21

Tengo un problema con mi instalación de Drupal, por ejemplo:

  • cuando habilito o deshabilito los módulos, me redirige a una página en blanco,
  • cuando creo un nuevo tipo de contenido y lo guardo, me redirige a una página en blanco,
  • cuando agrego una nueva vista y la guardo, me redirige a una página en blanco,
  • cuando trato de borrar el caché, me redirige a una página en blanco,
  • o en casos similares.

Básicamente, todas las páginas de confirmación me redirigen a una pantalla en blanco. Cuando lo actualizo nuevamente, me muestra la página. Traté de aumentar el valor de la memoria PHP pero no ayuda.

¿Hay alguna otra solución para esto?

El error que estoy teniendo:

Error grave: tamaño de memoria permitido de 100663296 bytes agotados (intentó asignar 8192 bytes) en sitios / todos / módulos / vistas / plugins / views_plugin_localization_none.inc en la línea 1

Jayaram
fuente
2
Siempre revise los registros de errores, tendrá toda la información necesaria. Parece que en tu caso te estás quedando sin memoria. Drupal 7 requiere más de 32 MB, que muchos proveedores de host lo configuran como predeterminado.
GoodSp33d

Respuestas:

20

Sé que esto puede llegar tarde, pero me ayudó. La mayoría de las veces que un módulo causa WSOD, no podría simplemente deshabilitar los módulos para probar cuál era, ya que podría haber perdido datos en el proceso. Lo que hice fue editar temporalmente esta función module.incen el includesdirectorio principal

function module_invoke_all($hook) {
  $args = func_get_args();
  // Remove $hook from the arguments.
  unset($args[0]);
  $return = array();
  foreach (module_implements($hook) as $module) {

        print "Starting loading $module <br />";

        $function = $module . '_' . $hook;
        if (function_exists($function)) {
          $result = call_user_func_array($function, $args);
          if (isset($result) && is_array($result)) {
            $return = array_merge_recursive($return, $result);
          }
          elseif (isset($result)) {
            $return[] = $result;
          }
        }

        print "Finished loading $module <br />";

  }

  return $return;
}

Y agregué esas 2 declaraciones de impresión en el código anterior, luego actualicé la página, el módulo que no alcanzó la declaración "Finalizar cargando $ módulo" es el que tiene el problema ... fue desarrollado en mi caso.

Después de encontrar el módulo, puede ir a la tabla del sistema y buscar ese módulo, establecer su estado = 0 y bootstrap = 0 o ejecutar la consulta:

UPDATE system SET status = 0, bootstrap = 0 WHERE name = 'module_name' LIMIT 1

Referencia: Depuración de la pantalla blanca de la muerte de Drupal (WSOD)

Joshua Kissoon
fuente
1
Agregar las declaraciones de impresión a module_invoke_all me permitió encontrar rápidamente el módulo ofensivo. Luego usé drush para deshabilitarlo. ¡Qué salvavidas!
Dan Meigs
De nada @DanMeigs. He usado este método solo hoy para arreglar mi blog cleverlogic.net . Tal vez debería escribir un artículo sobre esto, porque seguro que leí mucho mientras intentaba arreglar el WSOD
Joshua Kissoon
11

Pega este código en tu index.phparchivo. Le mostrará el mensaje de error en lugar de la página en blanco. Al menos la raíz del problema puede ser conocida. Pégalo justo después de la etiqueta php.

    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);

Espero que te muestre el camino!

http://drupal.org/node/158043

Sandesh Yadav
fuente
1
Eso no funcionó, intenté eso ayer para ver los errores, pero no imprime nada
Jayaram
3
¿Has revisado tu registro de errores? Si se está utilizando Apache en Linux, utilice este comando en el terminal: tail /var/log/apache2/error.log. Eso le mostrará las 10 líneas más recientes de ese archivo.
Charlie Schliesser
En realidad, comenzó a mostrarme los errores. El error que obtengo es un error fatal: se agotó el tamaño de memoria permitido de 100663296 bytes (trató de asignar 8192 bytes) en *** / sites / all / modules / views / plugins / views_plugin_localization_none.inc en línea 1
Jayaram
1
Agregar esto a index.phpes una mala idea (incluso temporal, ya que la mayoría de las personas son perezosas para eliminarlo más adelante si esto funciona), es mejor pegarlo directamente en su archivo de configuración.
kenorb
10

La razón de la pantalla blanca en blanco de la muerte es la notificación de errores desactivada, para verificar el error agregue las siguientes líneas en su archivo setting.php:

error_reporting(E_ALL);
$conf['error_level'] = 2;
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

Para el error que enfrenta ("Tamaño de memoria permitido de XXX bytes agotado"), puede intentar lo siguiente:

  1. Trunca el caché manualmente y verifica si soluciona el problema (probablemente sea bueno hacer una copia de seguridad de tu base de datos antes de hacerlo):

    Access phpMyAdmin and truncate all tables starting by cache_ from the database.

  2. Aumente el límite de memoria (ya que la razón principal del error anterior es la memoria agotada por el servidor que causó la carga parcial de los módulos y que está causando el problema) agregando la siguiente línea en su archivo settings.php: ini_set('memory_limit', '-1');
    Agregar ini_set('memory_limit', '-1'); reemplaza el Límite de memoria PHP predeterminado.
    Si desea restringir la memoria -1, puede proporcionar un tamaño de memoria como '256M' O '512M'.

Ankit Agrawal
fuente
6

Bien podría ser que uno de sus módulos se esté quedando sin memoria.

Puede agregar una línea de código a su archivo index.php para permitir que Drupal se ejecute con más memoria que la configuración predeterminada:

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

Agregue el código anterior en la línea después del? Php en su archivo /drupal/index.php. Si todo comienza a funcionar bien, puede identificar qué está causando el problema de memoria (muy probablemente sea un módulo).

Deshabilite un módulo y luego comente ini_set ('memory_limit', '256M'); y mira si se carga ahora.

No se recomienda dejar ini_set ('memory_limit', '256M'); como solución, pero al menos puede permitirle acceder a la página de listado de módulos.

Puede resultarle útil hacer un debug_backtrace () para determinar qué estaba usando la memoria.

Johnathan Elmore
fuente
Esto no ayudó
Jayaram
Además, puedo ver la página de lista de módulos, solo ocurre cuando habilito / deshabilito los módulos, tendría que actualizarlo nuevamente para ver la página de confirmación.
Jayaram
2
En lugar de poner llamadas ini_set () en index.php, donde se eliminarán en una actualización, si tiene que codificarlas en PHP, debe ponerlas en su archivo settings.php, que es el lugar correcto para sitios específicos anulaciones
Alfred Armstrong
Agregar esto a index.phpes una mala idea (incluso temporal, ya que la mayoría de las personas son perezosas para eliminarlo más adelante si esto funciona), es mejor pegarlo directamente en su archivo de configuración.
kenorb
6

El error:

Error fatal: tamaño de memoria permitido de X bytes agotado (se intentó asignar Y bytes)

Para convertir bytes X en MB, divida por 1024 * 1024 o verifique en Wolfram .

sucede cuando PHP intenta asignar Y bytes, pero hay un límite estricto en X bytes establecido por la memory_limitconfiguración de PHP .

El límite actual se puede verificar yendo a Administración »Informes» Informe de estado »PHP (URL:) /admin/reports/status/phpo imprimiendo ini_get('memory_limit')en PHP (tenga en cuenta que el límite puede ser diferente para UI y CLI).

Para solucionarlo, debe reducir el uso de recursos, por ejemplo:

  • deshabilite cualquier módulo de desarrollo que no esté usando actualmente (recomendado),

    Esto incluye: Devel, Devel Themer (si está habilitado).

  • deshabilite cualquier módulo que no esté usando,

  • deshabilite ciertas variables de depuración que pueden afectar sus recursos de memoria, por ejemplo, algunos ejemplos con drush:

    drush -y vset rules_debug 0
    drush -y vset rules_debug_log 0
  • deshabilitar ciertas extensiones PHP, como XDebug,

  • Habilitar cachés redis / memcached y algunos cachés PHP (por ejemplo, OPCache / XCache),
  • finalmente, si lo anterior no ayuda, aumente memory_limitsu configuración de PHP .

Si decide aumentar el límite de memoria, muchas personas aquí aconsejan piratear su núcleo pegando el código PHP index.phppara aumentar su memoria PHP, ¡ nunca haga eso ! Es una muy mala práctica.

En su lugar, edite su settings.php(o settings.local.phpsi lo tiene incluido) y pegue el siguiente código allí al final:

ini_set('memory_limit', '512M');

o una mejor manera de hacerlo es editar su archivo de configuración de PHP ( php.ini) y cambiar la siguiente línea:

memory_limit = 512M  ; Maximum amount of memory a script may consume

Si no está seguro de dónde está php.ini, consulte por:

  • drush status mando
  • o yendo al /admin/reports/status/php.

Para investigar más a fondo qué páginas / componentes están utilizando más memoria, tiene las siguientes posibilidades:

Para más información, consulte:

kenorb
fuente
1
+1 por enfatizar que php UI y CLI pueden tener diferentes memory_limit. Tuve el problema informado solo drushporque tenía un error /etc/php/7.0/cli/php.inipero no en /etc/php/7.0/cli/php.ini, así que la interfaz de usuario de drupal funcionaba bien. ¡Gracias!
miro marchi
1

Puede usar un módulo para controlar este límite de memoria. El módulo PHP Runtime Configurator proporciona muchas opciones para configurar sin cambiar su archivo php.ini y reiniciar Apache.

Puede configurar los siguientes parámetros:

  • Límite de carga de archivos
  • Limite de memoria
  • Límite máximo de tiempo de ejecución
  • Límite máximo de entrada variable

Sahil Gupta
fuente