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 обновлен с возможным решением там.
Дэвид Томас
Если я отключаю модуль, но не удаляю его, есть ли в этом случае какие-либо недостатки по сравнению с его удалением?
Марио Авад
Модуль будет иметь строку в системной таблице! Установка Un стирает все, что связано с модулем в БД и в файловой системе, если процедура 'un install' написана правильно!
Бхавин Джоши