Drupal chiama "is_dir" oltre 4000 volte?


17

Dopo aver avuto problemi con il tempo di caricamento di un sito molto importante, ho installato XHPROF e ho controllato le statistiche per vedere dove posso migliorare il mio codice.

Ho trovato qualcosa di interessante che non capisco. Drupal chiama "is_dir" più di 4000 volte su quasi ogni richiesta e ciò richiede circa 800ms per l'esecuzione. Perché è così e c'è un modo per accelerarlo?

immagine dello schermo

Con un tempo di caricamento di 2-4 secondi, 800 ms prendono una grande parte.


Hai attivato la ricostruzione automatica del registro?
mpdonadio

@MPD Ho disabilitato le ricostruzioni automatiche del registro.

Ed è così che Drupal riconosce nuovi moduli, temi e librerie in diverse directory!
Bhavin Joshi,

Risposte:


19

Quando disinstalli un modulo, devi prima disabilitarlo nell'amministratore del modulo Drupal. Dovresti quindi disinstallarlo tramite la scheda "Disinstalla" lì.

Lo stesso vale per i temi, disabilita prima l'amministratore del tema.

Se, ad esempio, si elimina la cartella del modulo sul file system senza disabilitare il modulo, Drupal continuerà a cercare il modulo nel file system, il che può causare, tra gli altri errori, il problema riscontrato.

Vedi anche: Evita di ripetere la scansione della directory dei moduli quando mancano più moduli

In risposta al commento di MPD, dovrai fare qualcosa del genere

SELECT name, filename FROM system WHERE status = 1;

e incrociarlo con i moduli sul tuo file system. Dovrebbero essere presenti tutti i moduli abilitati e anche i temi.

C'è anche una funzione (leggermente adattata) Martin_Dresden pubblicata qui:

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

}

Ciò può aiutare il debug.


1
C'è un modo per determinare in quale riga si {system}trova il problema?
mpdonadio

Risposta @MPD aggiornata con possibile soluzione lì.
David Thomas,

Se disabilito un modulo ma non lo disinstallo, ci sono degli svantaggi in questo caso rispetto alla disinstallazione anche?
Mario Awad,

Il modulo avrà una riga nella tabella di sistema! Una installazione cancella tutto ciò che riguarda il modulo in db e nel file system se la routine di "disinstallazione" è scritta correttamente!
Bhavin Joshi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.