Drupal chamando "is_dir" mais de 4000 vezes?

17

Depois de ter problemas no tempo de carregamento de um site muito importante, instalei o XHPROF e examinei as estatísticas para ver onde posso melhorar meu código.

Encontrei algo interessante que não entendo. Drupal chama "is_dir" mais de 4000 vezes em quase todas as solicitações e isso leva cerca de 800ms para ser executado. Por que isso e existe uma maneira de acelerar isso?

captura de tela

Com um tempo de carregamento de dois a quatro segundos, 800ms tomam uma grande parte.

kiamlaluno
fonte
Você tem reconstruções automáticas de registro ativadas?
mpdonadio
@MPD Desativei as recriações automáticas do registro.
E é assim que o Drupal reconhece novos módulos, temas e bibliotecas em diferentes diretórios!
Bhavin Joshi

Respostas:

19

Ao desinstalar um módulo, é necessário desativá-lo primeiro no módulo Administrador do Drupal. Você deve desinstalá-lo através da guia "Desinstalar".

O mesmo vale para temas, primeiro desabilite o administrador de temas.

Se, por exemplo, você excluir a pasta do módulo no sistema de arquivos sem desativá-lo, o Drupal continuará pesquisando o módulo no sistema de arquivos, o que pode resultar, entre outros erros, no problema que está ocorrendo.

Consulte também: Evite verificar novamente o diretório do módulo quando vários módulos estiverem ausentes

Em resposta ao comentário do MPD, você precisará fazer algo como

SELECT name, filename FROM system WHERE status = 1;

e faça referência cruzada com os módulos em seu sistema de arquivos. Todos os módulos ativados e os temas também devem estar presentes.

Há também uma função (ligeiramente adaptada) Martin_Dresden postada aqui:

https://drupal.org/node/1080330#comment-6520842

function MYMODULE_init() {

    $startingtime = microtime(true); 
    $o = '<p>Checking for dead modules ...</p>';
    $result = db_select('system')
      ->fields('system', array('filename'))
      ->condition('status', '1', '=')
      ->execute();
      $n = 1;
      $m = 0;
    foreach ($result as $row) {
      $path = DRUPAL_ROOT.'/'.$row->filename;
      If (!file_exists($path)) { 
          $o .= "#$n $path<br>";
          $m++;
      }
      $n++;
    }
    $timedif =  round(microtime(true) - $startingtime,3);
    $o .= "Total of $n active modules registered in database. $m dead entries found.<br>";
    $o .= 'Query Time: '.$timedif.' seconds';

    drupal_set_message($o);

}

Isso pode ajudar na depuração.

David Thomas
fonte
1
Existe uma maneira de determinar em qual linha {system}está o problema?
mpdonadio
Resposta do @MPD atualizada com uma possível solução.
David Thomas
Se eu desabilitar um módulo, mas não o desinstalar, há alguma desvantagem nesse caso em comparação com a desinstalação também?
Mario Awad
O módulo terá uma linha na tabela do sistema! A instalação de Un limpa todos os itens relacionados ao módulo no db e no sistema de arquivos se a rotina 'un install' for escrita corretamente!
Bhavin Joshi