2012-08-04 4 views
2

사용자가 페이지에 액세스 할 때마다 지나치게 호출되는 로더 기능이 있습니다. 물론, 페이지 요청 당 한 번만 실행하면됩니다. 대신 여러 번 호출됩니다. 이전에 _load()는 MENU_CALLBACK으로 두 번만 실행되었지만 기본 MENU_NORMAL_ITEM으로 테스트 한 결과 4로 증가했습니다. 다시 변경하고 캐시를 지웠지 만 지금은 4 번 실행되며 한 번만 실행되기를 원합니다.와일드 카드 로더 함수가 여러 번 호출 됨 (_load)

제 질문은 제 로더 기능이 여러 번 호출되는 이유는 무엇입니까? 어떤 통찰력이라도 대단히 감사하겠습니다.

$items['daycare/%isValid/home'] = array(
    'title' => 'Daycare Admin Home', 
    'page callback' => 'daycares_home_page', 
    'load arguments' => array(0),//Passes 1st part of url 'daycare' as 2nd arg 
    'page arguments' => array(0), 
    'access arguments' => array('access content'), 
    'type' => MENU_CALLBACK, 
); 

function isValid_load($pageID, $pageType){ 
    /*Do stuff to validate wildcard part of URL. Will throw 404/403 if invalid*/ 
    return $pageId; 
} 

답변

3

당신은 당신의 부하 함수를 호출 어떤 방법/볼 develddebug_backtrace() 기능을 사용할 수 있습니다. 당신이 할 때

function isValid_load($pageID, $pageType){ 
    ddebug_backtrace(); 
    ... 
} 

는 두 통화가 index.php의 마지막 두 줄을 맞댄 추적 될 수 있다는 것을 알 수 있습니다. 첫 번째는 Drupal을 부트 스트랩하고 테마를 초기화하는 반면 두 번째 호출은 실제로 페이지를 렌더링하는 작업을 수행합니다. 두 작업 모두 동일한 _menu_translate()을 호출하는 것으로 보이지만 사용자의 기능을 호출합니다.

실적에 대해 우려하는 점이 있으면 Lullabot article about caching에 관심을 가질 수 있습니다.

드루팔 (Drupal)의 가장 깊은 작업에 익숙해 져있어 부분 응답입니다. Drupal 프레임 워크가 _load 함수가 여러 번 호출되는 방식으로 구조화 된 이유를보다 명확하고보다 완전하게 설명 할 수있는 경쟁 응답을 환영합니다.

+0

답변은 여전히 ​​매우 유용합니다! 감사합니다 Nmc. 역 추적을 사용해 보겠습니다. 나는 단지 성과에 관심이 없다. _load() 내에서 처리 할 작업은 매우 간단한 쿼리입니다. 그래도 나중에 사용할 수 있도록 북마크에 추가했습니다. :) – SFox

+1

또 다른 옵션은 xdebug를 구성하고 디버거를 통해 코드를 푸는 것입니다. 가끔은 약간 까다로울 수 있습니다. 그런 다음 와일드 카드 로더에 중단 점을 지정하고 값을 검사하고 호출 스택을 조사 할 수 있습니다. – iainp999