2009-07-14 3 views
3

Drupal은 현재 사용자가로드하는 컨텐트와 무관 한 후크를 구문 분석합니까 (및/또는 실행합니까)? 예를 들어Drupal은 사용되지 않는 후크를 파싱합니까?

, 나는 모듈 foo는 다음 후크를 설치하고 활성화 한 말 :

<?php 
// .. stuff ...  
function foo_menu() { 
     $items = array(); 
     $items['foo/show'] = array(
     'title' => t('Foo!'), 
     'page callback' => 'foo_display_all', 
     'description' => 'All our foo are belong to you', 
     'type' => MENU_NORMAL_ITEM, 
    ); 
     return $items; 
    } 

    function foo_display_all() { 
    // About 100 lines of code 
    } 
// ... stuff ... 

겠습니까 드루팔 구문 분석 foo_menu에 나열되지 않은 페이지 (따라서로드 시간에 영향을)? 달리 말하자면, foo_display_all의 길이와 복잡성은 www.example.com/bar의로드 방식에 영향을 미칩니 까?

여기에 두 가지 질문이있을 위험이 있으므로 Drupal이 예/아니오 답변이 아닌 방법 및 이유를 분석하는 방법에 대한 설명 (또는 설명 링크)에 감사하게 생각합니다.

답변

6

hook_menu는 drupal에게 특정 URL에서 수행 할 작업을 알려주기 때문에 결과가 캐싱됩니다.

Drupal은 자신이 위치한 파일의 전체 내용이 아닌 후크 내용 만 실행합니다. 위의 예에서 후크 메뉴가 호출되면 foo_menu() 함수가 실행됩니다. 당신은 Hooks API

편집에서 인트로 텍스트에서 좀 걸릴 수 있습니다 : 을 위해 PHP 함수를 실행하기 위해, 그것은이있는 파일을 포함 할 필요가있다. 그래서 드루팔 (Drupal)이 후크를 실행하려고 할 때, PHP는 그 파일에서 코드를 파싱 할 필요가 있습니다. PHP가 어떻게 디자인 되었는가? 드루팔 (Drupal과 관련이 없다.

많은 수의 모듈이 후크가 시작될 때 필요한 코드 양을 제한하기 위해 많은 inc 파일을 만드는 이유이기도합니다.

+0

감사합니다. 그러나 파일이 읽히고 파싱 될지 궁금합니다. Drupal이 사용되지 않는 함수를 실제로 실행하지 않을 정도로 똑똑하다는 것에 감사하지만, 파일을 읽거나 파싱 한 다음 무시하는 경우에는 알지 못합니다. 필요하지 않으면 전혀 읽지 않습니다. 아마도 이것이 무엇을 의미합니까? – anschauung

+1

사용자 파일에 inc 파일을 원하지 않는다면 나는 그렇게 생각합니다. –

+0

설명해 주셔서 감사합니다. .inc 파일 사용에 대한 귀하의 답변은 아래의 Craig의 대답과 다소 모순이 있지만이를 해결하기 위해 새로운 질문을 게시 할 것입니다. – anschauung

3

Drupal에는 모든 요청마다 모든 모듈에 대한 모든 MODULE.module 파일 (및 포함 된 모든 파일)이 포함됩니다.

드루팔 코어가 모듈에 호출해야하는 훅이 있는지를 알 수있는 유일한 방법은 파일을로드하는 것입니다. 시간과 기억이 필요합니다. 모든

+0

설명해 주셔서 감사합니다. .inc 파일 사용에 대한 귀하의 의견은 @ googletorp의 대답과 다소 모순되지만 새로운 문제는이를 해결하는 가장 좋은 방법이라고 생각합니다. – anschauung

+0

.module 파일에 함수 안에 include 문이 있으면 함수가 호출 될 때 포함 된 파일 만 읽혀집니다. include가 전역 범위에 있으면 포함 파일이 항상 읽혀집니다. – Craig

3

전나무, 나는 두 번째는, 나는이 시도하지 않은 편안한 구현 및 세 번째 아니라, 경험 드루팔 개발자 아니지만,

function foo_display_all() { 
    include("foo_display_all_body.php"); 
} 

후크가 구문 분석이 방식으로 작동한다 매번, 함수 본문과 함께 하나의 추가 PHP 파일.

넷째, 미세 최적화입니다. 추가 복잡성 (및 +1 파일 읽기)이 파싱시 절약되는 것보다 장기적으로 더 많은 비용을 부담 할 수 있기 때문에 절대적으로 필요하지 않은 경우 피하는 것이 좋습니다.

당신이 PHP 코드를 빠르게 분석 확인하려면, 당신은 연산 코드 캐시를 사용한다

4

예. 다른 사람들이 지적했듯이 조건 적으로로드되는 포함 파일로 항목을 분할하는 것이 유일한 방법입니다. Drupal 6부터는 hook_menu() 페이지 콜백뿐만 아니라 theme_whatever() 함수를 별도의 포함 파일로 이동할 수있게되었습니다. 당신이 명시 적 require_once() 저글링을하지 않아도 필요할 때 Drupal이 자동으로로드합니다.

자세한 내용은 hook_menu()hook_theme() 설명서를 참조하십시오.

그것은 당신이 조건부 포함의 무리에 APC와 같은 연산 코드 캐시, 분할 일을 실행하는 경우 것이 사실이므로주의하는 것도 중요 - APC는의 PHP 소스의 구문 분석 및 컴파일의 모든 작업을 수행 할 수 있습니다 한 명은 요청간에 지속됩니다. 조건 적으로 상황을 나누는 것은 수행중인 작업에 따라 컴파일 할 여러 개의 '코드베이스'를 제공합니다.

현재 개발중인 Drupal 7에는 모든 후크 구현을 별도의 인클루드 파일로 분리 할 수있는 일반 Code registry이 추가되었습니다. 그러나 함수 및 .inc 위치의 내부 캐시를 관리하고로드하는 작업의 오버 헤드로 인해 구문 분석 코드가 작은 코드의 성능이 향상됩니다. 유일한 실제 보상은 12-16MB의 메모리 제한이있는 공유 호스트의 메모리 사용량을 줄이는 것입니다. 변경 사항이 드루팔 (Drupal 7)의 최종 릴리스까지 생존 할 것인지 여부는 확실하지 않습니다.

Drupal 6에서 upshot :은 사용자 지정 페이지를 별도의 .inc 파일로 빌드하는 메뉴 콜백을 분리하며, 해당 페이지가 빌드 될 때만로드됩니다. 어떤 테마 기능과도 동일하게하십시오. 그리고 APC와 같은 opcode 캐시을 사용하는 경우 별도의 .inc 파일은 조직적인 용도로만 사용하면 성능이 향상되지 않습니다.

+0

위대한 답변 - 자세한 설명 주셔서 감사합니다! – anschauung

0

APC는 현재 .inc 파일뿐만 아니라 큰 성능 향상을 제공하는 php를 캐시하는 것으로 보입니다.

관련 문제