Tela branca da morte: Erro fatal: tamanho de memória permitido de X bytes esgotado

21

Eu tenho um problema com minha instalação do Drupal, por exemplo:

  • quando eu ativo ou desativo os módulos, ele me redireciona para uma página em branco,
  • quando eu crio um novo tipo de conteúdo e o salvo, me redireciona para uma página em branco,
  • quando adiciono uma nova visualização e a salvo, ela me redireciona para uma página em branco,
  • quando tento limpar o cache, ele me redireciona de volta para uma página em branco,
  • ou em casos semelhantes.

Basicamente, todas as páginas de confirmação me redirecionam para uma tela branca. Quando eu atualizá-lo novamente, ele mostra a página. Eu tentei aumentar o valor da memória PHP, mas isso não ajuda.

Existem outras soluções para isso?

O erro que estou tendo:

Erro fatal: tamanho de memória permitido de 100663296 bytes esgotado (tentou alocar 8192 bytes) nos sites / all / modules / views / plugins / views_plugin_localization_none.inc na linha 1

Jayaram
fonte
2
Sempre verifique os logs de erros, pois eles terão todas as informações necessárias. Parece que no seu caso você está ficando sem memória. O Drupal 7 requer mais de 32 MB, que muitos provedores de host definem como padrão.
precisa saber é o seguinte

Respostas:

20

Eu sei que isso pode ser tarde, mas isso me ajudou. Na maioria das vezes um módulo causa o WSOD, eu não podia simplesmente desativar os módulos para testar qual era, pois posso ter perdido dados no processo. O que eu fiz foi editar temporariamente essa função no diretório module.incprincipalincludes

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;
}

E adicionei essas duas instruções de impressão no código acima e atualize a página. O módulo que não alcançou a instrução "Concluir o carregamento de $ módulo" é o que está com o problema ... foi desenvolvido no meu caso.

Depois de encontrar o módulo, você pode acessar a tabela do sistema e procurar por esse módulo, defina status = 0 e bootstrap = 0 ou execute a consulta:

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

Referência: Depurando a Tela Branca da Morte do Drupal (WSOD)

Joshua Kissoon
fonte
1
Adicionar as instruções de impressão a module_invoke_all permitiu-me encontrar rapidamente o módulo incorreto. Então eu usei drush para desativá-lo. Que salva-vidas!
Dan Meigs
De nada @DanMeigs. Hoje usei esse método apenas para corrigir meu blog cleverlogic.net . Talvez eu deveria escrever um artigo sobre isso, porque eu tenho certeza que ler muito whiles tentando obter o WSOD fixo
Joshua Kissoon
11

Cole este código no seu index.phparquivo. Ele mostrará a mensagem de erro em vez da página em branco. Pelo menos a raiz do problema pode ser conhecida. Cole-o logo após a tag php.

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

Espero que ele mostre o caminho!

http://drupal.org/node/158043

Sandesh Yadav
fonte
1
Isso não funcionou, tentei que ontem para ver os erros, mas não imprime nada
Jayaram
3
Você verificou seu log de erros? Se você estiver executando o Apache no Linux, tente este comando no terminal: tail /var/log/apache2/error.log. Isso mostrará as 10 linhas mais recentes desse arquivo.
Charlie Schliesser
Na verdade, ele começou a me mostrar os erros. O erro que eu recebo é o erro fatal: tamanho de memória permitido de 100663296 bytes esgotados (tentei alocar 8192 bytes) em *** / sites / all / modules / views / plugins / views_plugin_localization_none.inc na linha 1
Jayaram
1
Adicioná-lo a isso index.phpé uma má ideia (mesmo que temporária, como a maioria das pessoas tem preguiça de removê-lo mais tarde, se isso funcionar), é melhor colá-lo diretamente no seu arquivo de configurações.
kenorb
10

Razão da tela branca em branco da morte é o relatório de erros desativado. Para verificar o erro, adicione as seguintes linhas no seu arquivo setting.php:

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

Para o erro que você está enfrentando ("Tamanho de memória permitido de XXX bytes esgotado"), você pode tentar o seguinte:

  1. Trunque o cache manualmente e verifique se ele corrige o problema (provavelmente é bom fazer backup do seu banco de dados antes de fazer isso):

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

  2. Aumente o limite de memória (como o principal motivo do erro acima é a memória esgotada pelo servidor que causou o carregamento parcial dos módulos e está causando o problema) adicionando a seguinte linha no arquivo settings.php: A ini_set('memory_limit', '-1');
    adição ini_set('memory_limit', '-1'); substitui o limite de memória PHP padrão.
    Se você deseja restringir a memória, -1pode fornecer um tamanho de memória como '256M' OU '512M'.

Ankit Agrawal
fonte
6

Pode muito bem ser que um dos seus módulos esteja ficando sem memória.

Você pode adicionar uma linha de código ao seu arquivo index.php para permitir que o Drupal seja executado com mais memória do que a configuração padrão:

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

Adicione o código acima na linha após o? Php no seu arquivo /drupal/index.php. Se tudo começar a funcionar bem, você poderá identificar o que está causando o problema de memória (provavelmente é um módulo).

Desative um módulo e, em seguida, comente o ini_set ('memory_limit', '256M'); e veja se ele carrega agora.

Não é recomendável deixar o ini_set ('memory_limit', '256M'); no lugar como uma solução, mas pode pelo menos permitir que você acesse a página de listagem de módulos.

Você pode achar útil fazer um debug_backtrace () para determinar o que estava usando a memória.

Johnathan Elmore
fonte
Isso não ajudou
Jayaram
Além disso, eu posso ver a página da lista de módulos, isso só acontece quando eu habilito / desabilito os módulos, eu precisaria atualizá-la novamente para ver a página de confirmação.
precisa
2
Em vez de colocar chamadas ini_set () em index.php, onde elas serão eliminadas em uma atualização, se você precisar codificá-las em PHP, coloque-as em seu arquivo settings.php, que é o local correto para sites específicos. substituições.
Alfred Armstrong
Adicioná-lo a isso index.phpé uma má ideia (mesmo que temporária, como a maioria das pessoas tem preguiça de removê-lo mais tarde, se isso funcionar), é melhor colá-lo diretamente no seu arquivo de configurações.
kenorb
6

O erro:

Erro fatal: esgotado o tamanho da memória de X bytes (tentou alocar Y bytes)

Para converter bytes X em MB, divida por 1024 * 1024 ou verifique em Wolfram .

acontece quando o PHP tenta alocar bytes Y, mas há um limite rígido para os bytes X definidos pelas memory_limitdefinições de configuração do PHP .

O limite atual pode ser verificado indo para Administração »Relatórios» Relatório de status »PHP (URL:) /admin/reports/status/phpou imprimindo ini_get('memory_limit')em PHP (observe que o limite pode ser diferente para UI e CLI).

Para corrigi-lo, você precisa diminuir o uso de recursos, por exemplo:

  • desative todos os módulos de desenvolvimento que você não está usando no momento (recomendado),

    Isso inclui: Devel, Devel Themer (se ativado).

  • desative os módulos que você não está usando,

  • desabilite certas variáveis ​​de depuração que podem afetar seus recursos de memória, por exemplo, alguns exemplos com drush:

    drush -y vset rules_debug 0
    drush -y vset rules_debug_log 0
  • desativar certas extensões PHP, como XDebug,

  • habilitar caches redis / memcached e alguns caches PHP (por exemplo, OPCache / XCache),
  • finalmente, se o exemplo acima não ajudar, aumente memory_limitsua configuração do PHP .

Se você decidir aumentar o limite de memória, muitas pessoas aqui aconselham realmente invadir seu núcleo colando o código PHP no seu index.phppara aumentar sua memória PHP - nunca faça isso ! É uma prática muito ruim.

Em vez disso, edite seu settings.php(ou, settings.local.phpse você o incluir) e cole o seguinte código no final:

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

ou uma maneira melhor de fazer isso é editar o arquivo de configuração do PHP ( php.ini) e alterar a seguinte linha:

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

Se você não tiver certeza de onde está php.ini, verifique:

  • drush status comando
  • ou indo para /admin/reports/status/php.

Para investigar melhor quais páginas / componentes estão usando mais memória, você tem as seguintes possibilidades:

Para mais informações, verifique:

kenorb
fonte
1
+1 por enfatizar que a interface do usuário e a CLI do php podem ter diferentes memory_limit. Eu tive o problema relatado apenas drushexatamente porque havia um erro, /etc/php/7.0/cli/php.inimas não o /etc/php/7.0/cli/php.iniestava, portanto a interface do usuário drupal estava funcionando bem. Obrigado!
Miro marchi
1

Você pode usar um módulo para controlar esse limite de memória. O módulo PHP Runtime Configurator fornece muitas opções para configurar sem alterar o arquivo php.ini e reiniciar o Apache.

Você pode configurar os seguintes parâmetros:

  • Limite de upload de arquivo
  • Limite de memória
  • Limite máximo de tempo de execução
  • Limite máximo de variável de entrada

Sahil Gupta
fonte