Drupal називає "is_dir" понад 4000 разів?


17

Після проблем із завантаженням дуже важливого сайту я встановив XHPROF і переглянув статистику, щоб побачити, де я можу вдосконалити свій код.

Я знайшов щось цікаве, чого я не розумію. Drupal закликає "is_dir" понад 4000 разів майже на кожен запит, і на це потрібно близько 800 мс. Чому це так і чи існує спосіб прискорити це?

скріншот

За часом завантаження від двох до чотирьох секунд велика участь займає 800 мс.


Чи увімкнено автоматичну перебудову реєстру?
mpdonadio

@MPD Я відключив автоматичне відновлення реєстру.

І саме так Drupal розпізнає нові модулі, теми та бібліотеки в різних каталогах!
Бхавін Джоші

Відповіді:


19

Коли ви видаляєте модуль, його потрібно спочатку вимкнути в адміністраторі модуля Drupal. Потім слід видалити його на вкладці "Видалити" там.

Те саме стосується тем, спочатку вимкніть їх у адміністраторі тем.

Якщо ви, наприклад, видалите папку модуля у файловій системі, не вимикаючи модуль, Drupal продовжить пошук модуля у файловій системі, що може призвести, серед інших помилок, до проблеми, з якою ви стикаєтесь.

Дивіться також: Уникайте повторного сканування каталогу модулів, коли декілька модулів відсутні

Відповідаючи на коментар MPD, вам потрібно буде зробити щось на кшталт

SELECT name, filename FROM system WHERE status = 1;

і перехресне посилання на модулі вашої файлової системи. Усі включені модулі та теми також повинні бути присутніми.

Тут також розміщена функція (трохи адаптована) Martin_Dresden:

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

}

Це може допомогти налагоджувати.


1
Чи є спосіб визначити, у якому рядку {system}є проблема?
mpdonadio

Відповідь @MPD оновлена ​​можливим рішенням.
Девід Томас

Якщо я відключив модуль, але не видалив його, чи є в цьому випадку недоліки порівняно з видаленням?
Маріо Авад

Модуль матиме рядок у системній таблиці! Якщо установка видаляє все, що стосується модуля, у db та у файловій системі, якщо рутина 'un install' написана правильно!
Бхавін Джоші
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.