이번에는 XE가 어떤과정을 거쳐 실행되는 지 알아보겠습니다.
XE는 다음과 같은 단계들을 거쳐 실행되게 됩니다.
Step 1. 요청단계 (Request)
프로그램이나 사용자는 http://도메인/index.php에 접속해 데이터를 요청합니다.
이 요청에 응답하기위해 XE는 다음단계들을 차례로 실행합니다.
→ 처리파일 : index.php
Step 2. 초기화단계 (Context Init)
XE실행을 하기위한 초기화 단계입니다. 이 단계에서 정의된 값으로 XE가 동작합니다.
다음과 같은 사항들로 초기화가 진행됩니다.
- 요청 메소드 설정 (요청된 방식을 지정합니다. GET|POST|XMLRPC|JSON)
- 요청 메소드에 따라 모든 요청값들(GET|POST|XMLRPC|JSON)을 정리하여 저장
- DB 정보 불려오고 설정 (files/config/db.config.php의 DB정보 Load함)
- 사이트 기본모듈설정
- XE에서 사용할 언어를 설정하고, 해당 언어를 불려옴
- 해당 세션에 로그인된 회원정보를 불려오고, 값을 저장 (is_logged : 로그인됬으면 true , logged_info : 로그인정보)
- 자바스크립트에서 사용을 위한 URL값 저장 (current_url : 현재 URL , request_uri : 요청한 URL)
→ 처리파일 : classes/context/Context.class.php
Step 3. 모듈초기화단계 (ModuleHandler)
모듈실행을 위한 초기화 단계입니다.
다음과 같은 사항들로 초기화가 진행됩니다.
- 요청값에서 모듈검색에 도움이 될 값들을 추출 (module,act,mid,document_srl,module_srl,entry)
- XSS 공격방어를 위한 module,act,mid 값 체크 (체크시 이상이 있으면 XE실행 중단)
- SSL 사용시 SSL 적용 act에서 적용이 되있지않으면 https:// 로 처리
→ 처리파일 : classes/module/ModuleHandler.class.php
* 트리거 호출 - moduleHandler.init (before)
* 애드온 호출 - called_position : before_module_init
Step 4. 모듈검색단계 (ModuleHandler Init)
실행할 모듈을 결정하는 단계입니다.
모듈초기화 단계에서 추출한 모듈 검색값 (module,document_srl,mid)들을 가지고, 실행모듈을 결정합니다.
다음과 같은 과정을 거쳐 실행모듈을 검색합니다.
- 1차 시도 : 문서번호 (document_srl)로 모듈찾기를 시도합니다. (예시 : https://conory.com/14247)
- 2차 시도 : 모듈ID (mid)로 모듈찾기를 시도합니다. (예시 : https://conory.com/blog)
- 3차 시도 : 모듈이름 (module)이 있다면 해당 모듈로 결정합니다. (예시 : https://conory.com/index.php?module=admin)
실행할 모듈을 찾지못하면 사이트 기본모듈(메인페이지)로 결정됩니다.
결정된 모듈에 설정된 브라우저 제목,레이아웃이 설정됩니다.
→ 처리파일 : classes/module/ModuleHandler.class.php
* 트리거 호출 - moduleHandler.init (after)
Step 5. 모듈실행 준비단계 (procModule)
모듈실행전 실행할 모듈의 action 찾고, 필요한 자원들을 불려오는 단계입니다.
다음과 같은 과정을 거치며, 모듈실행을 준비합니다.
- 요청된 act가 없을 경우 index act로 설정합니다.
- 모듈의 conf/module.xml에서 요청된 act를 찾아 type, kind을 구별합니다.
- type이 controller일 경우 act method를 체크하여 요청이 allowed method가 아닐 경우 에러
- kind이 admin일 경우 관리자인지 체크하여 아닐 경우 에러
- 해당 act에 해당되는 type, kind로 모듈 인스턴스를 생성합니다. (모듈 자원 Load)
- 실행모듈에서 요청된 act를 찾을 수 없다면... (요청된 act가 다른모듈의 act일 경우)
- 1차 시도 : act이름에서 모듈이름을 추출합니다. [act 이름은 Type + 모듈이름 + 고유이름] action의 standalone속성이 false이면 에러
- 2차 시도 : action forward에서 act를 검색을 시도합니다. (XE의 action forward기능)
- 3차 시도 : 요청 act를 무시하고, 실행모듈의 index act로 실행합니다.
- 4차 : 그래도 act의 모듈을 찾을 수 없다면 에러!!
- 위 시도로 찾은 모듈이 있다면 그 모듈로 실행모듈을 변경합니다.
- action에 ruleset속성이 있다면 해당 ruleset을 체크합니다.
- 모듈권한 체크 (권한이 없으면 에러)
- 모듈의 init()함수를 실행합니다. (초기화 함수실행)
- 모바일접속시 pc모드일경우 모바일 접속안내메시지 하단에 추가합니다.
- 환경설정에서 설정한 푸터내용과 사이트 제목을 적용합니다.
* action의 standalone속성은 다른모듈에서 이 act 실행을 허용하는 속성입니다. 그런데 false이면 다른모듈에서 이 act실행을 거부하겠다는 뜻입니다.
→ 처리파일 : classes/module/ModuleHandler.class.php
* 트리거 호출 - moduleObject.proc (before)
* 애드온 호출 - called_position : before_module_proc
Step 6. 모듈실행단계 (moduleObject proc)
모듈실행을 수행하는 단계입니다.
먼저 접근권한 체크와 사이트 기본스킨이 있다면 템플릿을 지정합니다.
그 다음 모듈의 해당 함수를 실행합니다. ( $this->{$this->act}(); )
→ 처리파일 : classes/module/ModuleObject.class.php
* 트리거 호출 - moduleObject.proc (after)
* 애드온 호출 - called_position : after_module_proc
* 트리거 호출 - moduleHandler.proc (after)
Step 7. 화면출력 준비단계 (displayContent)
화면에 모듈실행 결과물 출력을 준비하는 단계입니다.
이때 요청 메소드가 HTML이 아니면 바로 화면출력 단계로 넘어 갑니다.
다음과 같은 과정을 거치며, 화면출력을 준비합니다.
- 윗단계에서 에러발생시 에러메시지를 출력하도록 설정합니다.
- 모듈검색단계에서 저장된 모듈의 레이아웃 정보 가져와 준비합니다.
→ 처리파일 : classes/module/ModuleHandler.class.php
* 트리거 호출 - display (before)
* 애드온 호출 - called_position : before_display_content
Step 8. 화면출력단계 (printContent)
화면에 모듈실행 결과물을 출력하는 단계로써 XE실행의 마지막 단계입니다.
요청메소드에 따라 (xml,XMLRPC,JSON,JS_CALLBACK,HTML) 최종결과물을 얻습니다.
HTML일경우 모듈 템플릿 파일을 컴파일하고 레이아웃이 있으면 레이아웃 템플릿파일을 컴파일후 합치게 됩니다.
또, ./common/tpl/common_layout.html 파일과 합쳐서 최종결과물이 완성됩니다.
그리고 결과물을 압축(gzip)인코딩합니다. (ob_gzhandler 사용시)
마지막으로 결과물을 출력합니다. (print $output;)
→ 처리파일 : classes/display/DisplayHandler.class.php
* 트리거 호출 - display (after)
이로써 XE실행은 완료됩니다. 좀 길죠?