모든 분석 지침은 연한 빨간색의 작은 4자 이탤릭체로 작성됩니다.
Index.php
//mediawiki 프로그램 항목
주요 웹 항목입니다.
이제 프로그램 코드의 첫 번째 줄을 살펴보고 PHP 버전이 5.3.2 이상인지 확인하세요. 그렇지 않다면, 페이지에 오류 메시지가 보고됩니다.
PHP 코드
- if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
- // dirname( __FILE__ ) 여기서 __DIR__은 PHP5.3+
- require dirname( __FILE__ ) '/includes/PHPVersionError입니다. .php';
- 다음 단계는 PHP 파일 Webstart.php를 도입하는 더 중요한 코드입니다.
- PHP 코드
require __DIR__
'/includes/WebStart. php'; . * 몇 가지 보안 검사를 수행하고 프로파일러를 시작한 다음 - * 구성을 로드하고 선택적으로 로드합니다. * MW_NO_SETUP이 정의되었는지 여부에 따라 Setup.php.
* Setup.php(로드된 경우) 그런 다음 AutoLoader인 GlobalFunctions를 설정합니다. ,
* 및 구성 전역($wgTitle은 아님).
WebStart .php의 파일 주석은 위와 같습니다. 이 파일이 수행하는 작업은 웹 요청에 대한 설정을 초기화하는 것입니다(보안 검사 수행, 디버깅 활성화, 전역 변수 및 상수 로드). 구성 파일. 마지막으로 미디어위키가 설치되지 않은 경우 setup.php를 호출하여 미디어위키를 설치합니다. 이 파일은 Defines.php(상수), LocalSettings.php(구성 파일, 전역 변수)를 호출하고 구성에 따라 여기에 문자 버퍼도 엽니다. 콜백 메서드는 OutputHandler.php의 wfOutputHandler 메서드입니다.
PHP 코드
if ( ini_get(
'register_globals' ) ) {
die (
'MediaWiki는 Register_globals가 활성화된 설치를 지원하지 않습니다. '. 'mediawiki.org '- . '비활성화 방법에 대한 도움말.' );
- } PHP 구성 항목 Register_globals가 ON이면 mediawiki를 실행할 수 없습니다. .
- # bug 15461: IE8에서 콘텐츠 스니핑을 끄도록 설정하세요.# 대체 항목의 경우에도 *항상* 설정되도록 여기에 추가합니다
-
#포인트 및 $wgOut이 비활성화되거나 재정의되는 경우에도.
PHP 코드
헤더(
'X-Content-Type-Options: nosniff' );
IE8의 콘텐츠 스니핑을 끄세요. 모두 무시하세요
PHP 코드
- $wgRequestTime = microtime( true );
함수는 현재 Unix 타임스탬프와 마이크로초를 반환합니다.
PHP 코드
- 설정 해제( $IP );
$IP를 정의하는 변수 등록 취소
PHP 코드
Define(- 'MEDIAWIKI', true );
상수 미디어위키 정의
# 작업 디렉터리의 전체 경로입니다.
# 예를 들어 apc에서 효과적인 제외 경로를 가질 수 있습니다.
# __DIR__은 symlinked를 포함하지만 realpath()는 false를 반환합니다
# 상위 디렉토리에 대한 권한이 없는 경우.
Php code 🎜>$IP =
getenv
( 'MW_INSTALL_PATH' ); - if ( $IP === false ) {
-
$IP = 실제 경로( '.'
) ?: dirname( __DIR__ ); - } PHP의 환경변수를 가져와서 설치 디렉터리를 가져옵니다.
# 프로파일러 로드
PHP 코드
require_once
"$IP/includes/profiler/Profiler.php"; >$wgRUstart = wfGetRusage() ?:
array
();
- ...
# 프로파일러 시작- //StartProfiler.php 파일에서는 ProfilerStub.php만 호출됩니다. 상황에 따라 디버깅에는 ProfilerStub.php에 정의된 wfProfileIn() 및 wfProfileOut() 두 가지 주요 함수를 사용해야 합니다.
PHP 코드
$wgProfiler = 배열
() ;
if (
file_exists
( "$IP/StartProfiler.php" ) ) { -
요구"$IP/StartProfiler.php"
🎜>- ... if ( !defined( 'MW_NO_SETUP' ) ) {
-
require_once"$IP/includes /Setup.php"; >
- require_한 번 많은 파일: Profiler.php(분석, 주로 DEBUG 디버깅에 사용됨) , AutoLoader.php(JAVA의 SPRING IOC 컨테이너와 유사한 클래스 관리 컨테이너), Defines.php, StartProfiler.php, DefaultSettings.php, autoload.php, NoLocalSettings.php, OutputHandler.php, Setup.php...
- 그런 다음 프로그램 비즈니스 처리 입구가 나옵니다.
- PHP 코드
- $mediaWiki = 새
미디어위키()
$mediaWiki
->run()
Mediawiki.php
MediaWiki 클래스는 mediawiki.php에 정의되어 있습니다. 여기에는 위키 객체의 다양한 방법이 포함됩니다. 그런 다음 $mediaWiki 개체를 위한 메모리 공간을 엽니다.
PHP 코드
- 공개함수 __construct( IContextSource $context = null ) {
- if ( !$context ) {
- $context = RequestContext::getMain();
- } >
- $this-> ;context = $context
; -
$this- >config = $context
->getConfig( ); - } 구축 메소드를 통해 요청 요청 객체와 구성 정보를 얻습니다.
PHP 코드
공개function
run() {
try {
- //요청에 지연된 요청이 포함된 경우 , 시스템의 마지막 작동 시간과 비교하십시오. 마지막 작업 시간이 최대 요청 지연 시간보다 길면 시간 초과 메시지가 표시됩니다.
- $this->checkMaxLag()
- 시도해 보세요 {
- //주요 방법은 주로 업무 흐름과 관련된 작업을 수행합니다.
- $this->main()
- } catch( ErrorPageError $ e ) {
- // Bug 62091: 예외는 GUI 오류를 발생시키는 데 일반적이지만
- // 일반적인 요청과 마찬가지로 이
- //는 커밋하고, 출력을 인쇄하고, 지연된 업데이트를 수행해야 합니다. 작업 및 프로파일링.
- wfGetLBFactory()->commitMasterChanges()
- $e ->report(); // GUI 오류 표시
- }
- ( function_exists( 'fastcgi_finish_request' ) ) {
- fastcgi_finish_request()
-
} $this
->triggerJobs()
- $this->restInPeace(); 🎜>
- } catch ( 예외 $e ) {
- MWExceptionHandler::handle( $e );
- } } >
- // Ajax 디스패처에 Ajax 요청 보내기 .
-
if
( - $ this->config->get( 'UseAjax'
) && - $request->getVal( 'action'
, - 'view' ) == 'ajax' ) {
- // $wgTitle == null이 문제를 일으킬 수 있으므로 더미 제목을 설정하세요 $title = Title::makeTitle( NS_MAIN, 'AJAX' )
-
$this;
->context->setTitle( - $title )
- $wgTitle = $title;
-
$dispatcher = new
AjaxDispatcher( - $this->config ); $dispatcher
->performAction( - $this->context->getUser( ) );
-
wfProfileOut( __METHOD__ ) 반환
; AJAX 요청을 활성화할지 여부를 결정하고 요청의 $action 값이 ajax인 다음 Ajax 요청을 Ajax dispather 프로세서로 보냅니다.
사용자가 forceHTTPS를 true로 설정한 경우, 또는 사용자
//가 HTTPS를 요구하는 그룹에 속해 있는 경우, 또는 HTTPS
// 기본 설정을 설정하고 HTTPS로 리디렉션합니다.
// 참고: $wgTitle이 설정된 후에 이 작업을 수행하고, 그렇지 않으면 후크는
// isLoggedIn()에서 실행되며 모든 종류의 이상한 작업을 수행합니다.
PHP 코드
- if (
- $request->getProtocol() == ' http' &&
- (
-
... >__METHOD__ );
- return; 🎜>}
- forcehttps를 true로 설정하고 https 액세스를 사용하는 경우 항목 재처리가 수행됩니다.
- PHP 코드
( $this
->config ->get( 'UseFileCache' ) && $title
->getNamespace() >= 0 ) {
wfProfileIn( 'main-try-filecache' ) - ... wfProfileOut( 'main- try-filecache' )
- }
- 구성이 파일 캐시 기능을 활성화하는지 확인하고 이름을 지정합니다. 공백이 1보다 크거나 같으면 파일 캐싱 메커니즘 관련 기능
을 사용합니다.
네임스페이스 값 네임스페이스 값 의미
-1
|
특수: 🎜>
|
1
| 대화: |
2
| 사용자: |
3
| User_talk:
|
4
| 테스트: 5
|
Test_talk:
|
6
|
이미지:
이미지 토크: |
8 |
미디어위키: |
9 |
MediaWiki_talk: |
10 |
템플릿: |
11 |
템플릿_토크: |
12 |
도움말: |
13 |
Help_talk: |
14 |
카테고리: |
15 |
카테고리 토크: |
16 |
온라인페이 |
// 실제로 요청 작업을 수행하고 출력을 구축합니다.
PHP 코드
- $this->performRequest(); 이 메소드는 출력 객체 $output을 생성합니다. 이 객체에는 다양한 출력 결과를 설정하는 해당 메소드가 있습니다.
PHP 코드
wfProfileIn(
__METHOD__
)
- 메소드의 첫 번째 문장에서 미디어위키의 기본 메소드 항목에 이런 문장이 있는 것을 알 수 있습니다. 그 뒤에는 DEBUG를 시작한 후 wfProfileOut( __METHOD__ )이 나타납니다. 모드에서는 해당 데이터가 인쇄됩니다. 인쇄 방법을 활성화하고 LocationSettings.php에서
$wgDebugLogFile=d:a.txt
값을 설정합니다. 참고: wfProfileIn과 wfProfileOut은 쌍으로 나타나야 합니다. 그렇지 않으면 오류가 발생합니다. 또한 디버깅 정보의 출력 순서는 다음과 같습니다. 먼저 일치하는 wfProfileIn 및 wfProfileOut 쌍의 디버깅 정보를 출력합니다. 즉, wfProfileIn이 아닌 wfProfileOut이 발생할 때만 디버깅 정보를 출력합니다. . PHP 코드
if
( $request-> ;getVal( - '인쇄 가능' ) === '예' ) { $output-> setPrintable();
- }
- 요청에 인쇄 요청이 있는지 확인합니다. 그렇다면 출력 개체에 표시하십시오.
PHP 코드
$unused
= null // 통과 참조하여
-
wfRunHooks( 'BeforeInitialize', array
( &- $title, &$미사용, &$output, &$user, $request, $this ) ) 요청 개체를 통해 사전 초기화 검사를 수행합니다. 이것은 시스템 후크 프로그램이며 BeforeInitialize 메서드를 구현하려면 플러그인이 필요합니다. 전체 텍스트 검색에서 이 메서드의 구체적인 실제 예를 찾을 수 없습니다.
// 이 페이지를 읽을 수 있는 사용자의 권한을 확인하세요.
// 특별한 페이지 등을 포착하려면 여기를 확인해야 합니다.
// Article::view()에서 다시 확인하겠습니다.
PHP 코드
$permErrors
= $title->isSpecial( - 'RunJobs' ) ? 배열() // HMAC 키 서명에만 의존
-
: $title->getUserPermissionsErrors( '읽기'
, - $user ); if ( count
( - $permErrors ) ) { 제목을 기준으로 사용자에게 페이지에 액세스할 수 있는 읽기 권한이 있는지 확인합니다. 권한이 부족할 경우 항목 페이지를 구성하고 돌아옵니다.
// 모든 DB 및 지연 업데이트가 발생하거나 발생하지 않아야 합니다.
// 클라이언트 연결 끊김으로 인해 나중에 취소하면 안 됩니다.
PHP 코드
ignore_user_abort( true )
PHP에서 제공하는 기능으로 true로 설정하면 사용자와의 연결 끊김을 무시합니다. PHP는 클라이언트에 정보를 보내려고 시도할 때까지 사용자의 연결이 끊어졌는지 감지하지 못합니다.
// 이제 모든 트랜잭션을 커밋하여
// 출력() 이후에 보고되지 않은 오류가 전체 DB 트랜잭션을 롤백하지 않도록 합니다.
PHP 코드
- wfGetLBFactory()->commitMasterChanges()
제출된 사항은 오류가 있을 경우 롤백됩니다.
//모두 출력!
PHP 코드
- $this->context->getOutput()->output()
페이지가 첫 페이지로 출력됩니다. , 여기 문장 앞의 모든 데이터에는 스타일이 포함되지 않습니다. 워드 코드 실행은 반환 데이터 유형에 따라 다른 스킨을 추가합니다.
PHP 코드
- wfProfileOut( __METHOD__ )
위 내용을 포함하여 mediawiki1.24 소스코드 분석(1)을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.