¿Drupal llamando "is_dir" más de 4000 veces?

17

Después de tener problemas en el tiempo de carga de un sitio muy importante, instalé XHPROF y revisé las estadísticas para ver dónde puedo mejorar mi código.

Encontré algo interesante que no entiendo. Drupal llama "is_dir" más de 4000 veces en casi todas las solicitudes y esto demora unos 800 ms en ejecutarse. ¿Por qué es eso y hay una manera de acelerar eso?

captura de pantalla

Por un tiempo de carga de dos a cuatro segundos, 800ms toman una gran parte.

kiamlaluno
fuente
¿Tiene activadas las reconstrucciones de registro automáticas?
mpdonadio
@MPD He desactivado las reconstrucciones automáticas del registro.
¡Y así es como Drupal reconoce nuevos módulos, temas y bibliotecas en diferentes directorios!
Bhavin Joshi

Respuestas:

19

Cuando desinstala un módulo, primero debe deshabilitarlo en el administrador del módulo Drupal. Luego debe desinstalarlo a través de la pestaña "Desinstalar".

Lo mismo ocurre con los temas, primero deshabilítelos en el administrador de temas.

Si, por ejemplo, elimina la carpeta del módulo en el sistema de archivos sin deshabilitar el módulo, Drupal continuará buscando el módulo en el sistema de archivos, lo que puede ocasionar, entre otros errores, el problema que está experimentando.

Consulte también: Evite volver a escanear el directorio del módulo cuando faltan varios módulos

En respuesta al comentario de MPD, deberá hacer algo como

SELECT name, filename FROM system WHERE status = 1;

y haga una referencia cruzada con los módulos en su sistema de archivos. Todos los módulos habilitados, y los temas también, deben estar presentes.

También hay una función (ligeramente adaptada) Martin_Dresden publicada aquí:

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

}

Eso puede ayudar a depurar.

David Thomas
fuente
1
¿Hay alguna manera de determinar en qué fila {system}está el problema?
mpdonadio
Respuesta @MPD actualizada con una posible solución allí.
David Thomas
Si desactivo un módulo pero no lo desinstalo, ¿hay alguna desventaja en este caso en comparación con también desinstalarlo?
Mario Awad
¡El módulo tendrá una fila en la tabla del sistema! La instalación de Un borra todo lo relacionado con el módulo en db y en el sistema de archivos si la rutina 'desinstalar' está escrita correctamente.
Bhavin Joshi