Drupal이 "is_dir"을 4000 번 이상 호출합니까?


17

매우 중요한 사이트의 로딩 시간에 문제가 발생한 후 XHPROF를 설치하고 통계를 살펴보고 코드를 개선 할 수있는 위치를 확인했습니다.

이해하지 못하는 흥미로운 것을 발견했습니다. Drupal은 거의 모든 요청에서 4000 번 이상의 "is_dir"을 호출하며이 작업을 실행하는 데 약 800ms가 걸립니다. 그 이유는 무엇이며 속도를 높일 수있는 방법이 있습니까?

스크린 샷

2-4 초의 로딩 시간으로 800ms가 큰 부분을 차지합니다.


자동 레지스트리 재 구축이 설정되어 있습니까?
mpdonadio

@ MPD 자동 레지스트리 재 구축을 비활성화했습니다.

그리고 이것이 Drupal이 다른 디렉토리의 새로운 모듈, 테마 및 라이브러리를 인식하는 방법입니다!
Bhavin Joshi

답변:


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 답변이 가능한 솔루션으로 업데이트되었습니다.
David Thomas

모듈을 비활성화했지만 제거하지 않으면이 경우 모듈을 제거하는 것과 비교하여 어떤 단점이 있습니까?
마리오 아 와드

모듈은 시스템 테이블에 행을 갖습니다! 'un install'루틴이 올바르게 작성된 경우 설치 제거는 DB 및 파일 시스템의 모듈과 관련된 모든 것을 지 웁니다!
Bhavin Joshi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.