Drupal woła „is_dir” ponad 4000 razy?

17

Po problemach z czasem ładowania bardzo ważnej strony zainstalowałem XHPROF i przejrzałem statystyki, aby zobaczyć, gdzie mogę poprawić swój kod.

Znalazłem coś interesującego, czego nie rozumiem. Drupal wywołuje „is_dir” ponad 4000 razy na prawie każde żądanie, a jego wykonanie zajmuje około 800 ms. Dlaczego tak jest i czy istnieje sposób, aby to przyspieszyć?

zrzut ekranu

Przez czas ładowania od dwóch do czterech sekund, 800ms bierze dużą rolę.

kiamlaluno
źródło
Czy masz włączone automatyczne przebudowy rejestru?
mpdonadio
@MPD Wyłączyłem automatyczne przebudowy rejestru.
I w ten sposób Drupal rozpoznaje nowe moduły, motywy i biblioteki w różnych katalogach!
Bhavin Joshi

Odpowiedzi:

19

Podczas odinstalowywania modułu musisz go najpierw wyłączyć w module administracyjnym modułu Drupal. Następnie odinstaluj go za pomocą zakładki „Odinstaluj”.

To samo dotyczy motywów, wyłącz najpierw w adminie motywu.

Jeśli na przykład usuniesz folder modułu w systemie plików bez wyłączania modułu, Drupal będzie kontynuował wyszukiwanie modułu w systemie plików, co może skutkować, między innymi, występowaniem problemu.

Zobacz także: Unikaj ponownego skanowania katalogu modułów, gdy brakuje wielu modułów

W odpowiedzi na komentarz MPD będziesz musiał zrobić coś takiego

SELECT name, filename FROM system WHERE status = 1;

i odnieś to do modułów w twoim systemie plików. Wszystkie włączone moduły i motywy również powinny być obecne.

Jest też funkcja (nieco dostosowana) Martin_Dresden opublikowana tutaj:

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

}

To może pomóc w debugowaniu.

David Thomas
źródło
1
Czy istnieje sposób na określenie, w którym wierszu {system}jest problem?
mpdonadio
Odpowiedź @MPD zaktualizowana o możliwe rozwiązanie.
David Thomas
Jeśli wyłączę moduł, ale go nie odinstaluję, czy w tym przypadku są jakieś wady w porównaniu do odinstalowania?
Mario Awad,
Moduł będzie miał wiersz w tabeli systemowej! Un-instalacja usuwa wszystko związane z modułem w db i systemie plików, jeśli procedura „odinstaluj” jest poprawnie napisana!
Bhavin Joshi