>백엔드 개발 >PHP 튜토리얼 >mediawiki1.24 소스 코드 분석 (1)

mediawiki1.24 소스 코드 분석 (1)

WBOY
WBOY원래의
2016-08-08 09:26:521782검색

모든 분석 지침은 연한 빨간색의 작은 4자 이탤릭체로 작성됩니다.

Index.php

//mediawiki 프로그램 항목

주요 웹 항목입니다.

이제 프로그램 코드의 첫 번째 줄을 살펴보고 PHP 버전이 5.3.2 이상인지 확인하세요. 그렇지 않다면, 페이지에 오류 메시지가 보고됩니다.

PHP 코드

  1. if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
  2. // dirname( __FILE__ ) 여기서 __DIR__은 PHP5.3+
  3. require dirname( __FILE__ ) '/includes/PHPVersionError입니다. .php';
  4. 다음 단계는 PHP 파일 Webstart.php를 도입하는 더 중요한 코드입니다.
  5. PHP 코드

require __DIR__

'/includes/WebStart. php'; .

* 몇 가지 보안 검사를 수행하고 프로파일러를 시작한 다음
  1. * 구성을 로드하고 선택적으로 로드합니다. * 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 '
  1. . '비활성화 방법에 대한 도움말.' );
  2. } PHP 구성 항목 Register_globals가 ON이면 mediawiki를 실행할 수 없습니다. .
  3. # bug 15461: IE8에서 콘텐츠 스니핑을 끄도록 설정하세요.# 대체 항목의 경우에도 *항상* 설정되도록 여기에 추가합니다
  4. #포인트 및 $wgOut이 비활성화되거나 재정의되는 경우에도.

PHP 코드

헤더(

'X-Content-Type-Options: nosniff'

);

IE8의 콘텐츠 스니핑을 끄세요. 모두 무시하세요

PHP 코드

  1. $wgRequestTime = microtime( true );

함수는 현재 Unix 타임스탬프와 마이크로초를 반환합니다.

PHP 코드

  1. 설정 해제( $IP );
$IP를 정의하는 변수 등록 취소

PHP 코드

    Define(
  1. 'MEDIAWIKI', true );
상수 미디어위키 정의

# 작업 디렉터리의 전체 경로입니다.

# 예를 들어

apc에서 효과적인 제외 경로를 가질 수 있습니다.

# __DIR__은

symlinked를 포함하지만 realpath()는 false를 반환합니다

# 상위 디렉토리에 대한 권한이 없는 경우.

Php code 🎜>$IP

=

getenv

( 'MW_INSTALL_PATH'
    );
  1. if ( $IP === false ) {
  2. $IP = 실제 경로( '.'
  3. ) ?: dirname( __DIR__ );
  4. } PHP의 환경변수를 가져와서 설치 디렉터리를 가져옵니다.
# 프로파일러 로드

PHP 코드

require_once

"$IP/includes/profiler/Profiler.php"; >$wgRUstart

= wfGetRusage() ?:

array

();
  1. ...
  2. # 프로파일러 시작
  3. //StartProfiler.php 파일에서는 ProfilerStub.php만 호출됩니다. 상황에 따라 디버깅에는 ProfilerStub.php에 정의된 wfProfileIn() 및 wfProfileOut() 두 가지 주요 함수를 사용해야 합니다.
PHP 코드

$wgProfiler = 배열

() ;

if

(

file_exists

( "$IP/StartProfiler.php"
    ) ) {
  1. 요구"$IP/StartProfiler.php"
  2. 🎜>
  3. ... if ( !defined( 'MW_NO_SETUP' ) ) {
  4. require_once"$IP/includes /Setup.php"; >
  5. require_한 번 많은 파일: Profiler.php(분석, 주로 DEBUG 디버깅에 사용됨) , AutoLoader.php(JAVA의 SPRING IOC 컨테이너와 유사한 클래스 관리 컨테이너), Defines.php, StartProfiler.php, DefaultSettings.php, autoload.php, NoLocalSettings.php, OutputHandler.php, Setup.php...
  6. 그런 다음 프로그램 비즈니스 처리 입구가 나옵니다.
  7. PHP 코드
  8. $mediaWiki =
  9. 미디어위키()

$mediaWiki

->run()

Mediawiki.php

MediaWiki 클래스는 mediawiki.php에 정의되어 있습니다. 여기에는 위키 객체의 다양한 방법이 포함됩니다. 그런 다음 $mediaWiki 개체를 위한 메모리 공간을 엽니다.

PHP 코드

  1. 공개함수 __construct( IContextSource $context = null ) {
  2. if ( !$context ) {
  3. $context = RequestContext::getMain();
  4. } >
  5. $this-> ;context = $context
  6. ;
  7. $this- >config = $context
  8. ->getConfig( );
  9. } 구축 메소드를 통해 요청 요청 객체와 구성 정보를 얻습니다.
PHP 코드

공개function

run() {

try {
  1. //요청에 지연된 요청이 포함된 경우 , 시스템의 마지막 작동 시간과 비교하십시오. 마지막 작업 시간이 최대 요청 지연 시간보다 길면 시간 초과 메시지가 표시됩니다.
  2. $this->checkMaxLag()
  3. 시도해 보세요 {
  4. //주요 방법은 주로 업무 흐름과 관련된 작업을 수행합니다.
  5. $this->main()
  6. } catch( ErrorPageError $ e ) {
  7. // Bug 62091: 예외는 GUI 오류를 발생시키는 데 일반적이지만
  8. // 일반적인 요청과 마찬가지로 이
  9. //는 커밋하고, 출력을 인쇄하고, 지연된 업데이트를 수행해야 합니다. 작업 및 프로파일링.
  10. wfGetLBFactory()->commitMasterChanges()
  11. $e ->report(); // GUI 오류 표시
  12. }
  13. ( function_exists( 'fastcgi_finish_request' ) ) {
  14. fastcgi_finish_request()
  15. } $this
  16. ->triggerJobs()
  17. $this->restInPeace(); 🎜>
  18. } catch ( 예외 $e ) {
  19. MWExceptionHandler::handle( $e );
  20. } } >
  21. // Ajax 디스패처에 Ajax 요청 보내기 .
  22. if
  23. (
  24. $ this->config->get( 'UseAjax'
  25. ) &&
  26. $request->getVal( 'action'
  27. ,
  28. 'view' ) == 'ajax' ) {
  29. // $wgTitle == null이 문제를 일으킬 수 있으므로 더미 제목을 설정하세요 $title = Title::makeTitle( NS_MAIN, 'AJAX' )
  30. $this;
  31. ->context->setTitle(
  32. $title )
  33. $wgTitle = $title;
  34. $dispatcher = new
  35. AjaxDispatcher(
  36. $this->config ); $dispatcher
  37. ->performAction(
  38. $this->context->getUser( ) );
  39. wfProfileOut( __METHOD__ ) 반환
  40. ;

    AJAX 요청을 활성화할지 여부를 결정하고 요청의 $action 값이 ajax인 다음 Ajax 요청을 Ajax dispather 프로세서로 보냅니다.

    사용자가 forceHTTPS를 true로 설정한 경우, 또는 사용자

    //가 HTTPS를 요구하는 그룹에 속해 있는 경우, 또는 HTTPS

    // 기본 설정을 설정하고 HTTPS로 리디렉션합니다.

    // 참고: $wgTitle이 설정된 후에 이 작업을 수행하고, 그렇지 않으면 후크는

    // isLoggedIn()에서 실행되며 모든 종류의 이상한 작업을 수행합니다.

    PHP 코드

    1. if (
    2. $request->getProtocol() == ' http' &&
    3. (
    4. ... >__METHOD__ );
    5. return; 🎜>} 
    6. forcehttps를 true로 설정하고 https 액세스를 사용하는 경우 항목 재처리가 수행됩니다.
    7. PHP 코드

    ( $this

    ->config ->get(

    'UseFileCache' ) && $title

    ->getNamespace() >= 0 ) {

    wfProfileIn( 'main-try-filecache'
      )
    1. ... wfProfileOut( 'main- try-filecache' )
    2. }
    3. 구성이 파일 캐시 기능을 활성화하는지 확인하고 이름을 지정합니다. 공백이 1보다 크거나 같으면 파일 캐싱 메커니즘 관련 기능
    4. 을 사용합니다.
    네임스페이스 값

    네임스페이스 값 의미

    1대화:  2사용자:  3User_talk:  4테스트: Test_talk:   이미지:
    -1

    특수:                                                                             🎜>

    5

    6

    이미지 토크: 

    8

    미디어위키:  

    9

    MediaWiki_talk:

    10

    템플릿: 

    11

    템플릿_토크:

    12

    도움말:  

    13

    Help_talk:  

    14

    카테고리:  

    15

    카테고리 토크:  

    16

    온라인페이

    // 실제로 요청 작업을 수행하고 출력을 구축합니다.

    PHP 코드

    1. $this->performRequest(); 이 메소드는 출력 객체 $output을 생성합니다. 이 객체에는 다양한 출력 결과를 설정하는 해당 메소드가 있습니다.

    PHP 코드

    wfProfileIn(

    __METHOD__

    )
    1. 메소드의 첫 번째 문장에서 미디어위키의 기본 메소드 항목에 이런 문장이 있는 것을 알 수 있습니다. 그 뒤에는 DEBUG를 시작한 후 wfProfileOut( __METHOD__ )이 나타납니다. 모드에서는 해당 데이터가 인쇄됩니다. 인쇄 방법을 활성화하고 LocationSettings.php에서
    2. $wgDebugLogFile=d:a.txt
    값을 설정합니다. 참고: wfProfileIn과 wfProfileOut은 쌍으로 나타나야 합니다. 그렇지 않으면 오류가 발생합니다. 또한 디버깅 정보의 출력 순서는 다음과 같습니다. 먼저 일치하는 wfProfileIn 및 wfProfileOut 쌍의 디버깅 정보를 출력합니다. 즉, wfProfileIn이 아닌 wfProfileOut이 발생할 때만 디버깅 정보를 출력합니다. .

    PHP 코드

    if

    ( $request
      -> ;getVal(
    1. '인쇄 가능' ) === '예' ) { $output-> setPrintable();
    2. }
    3. 요청에 인쇄 요청이 있는지 확인합니다. 그렇다면 출력 개체에 표시하십시오.

    PHP 코드

    $unused

    = null // 통과 참조하여
    1. wfRunHooks( 'BeforeInitialize', array
    2. ( &
    3. $title, &$미사용, &$output, &$user, $request, $this ) ) 요청 개체를 통해 사전 초기화 검사를 수행합니다. 이것은 시스템 후크 프로그램이며 BeforeInitialize 메서드를 구현하려면 플러그인이 필요합니다. 전체 텍스트 검색에서 이 메서드의 구체적인 실제 예를 찾을 수 없습니다.
    // 이 페이지를 읽을 수 있는 사용자의 권한을 확인하세요.

    // 특별한 페이지 등을 포착하려면 여기를 확인해야 합니다.

    // Article::view()에서 다시 확인하겠습니다.

    PHP 코드

    $permErrors

    = $title
      ->isSpecial(
    1. 'RunJobs' ) ? 배열() // HMAC 키 서명에만 의존
    2. : $title->getUserPermissionsErrors( '읽기'
    3. ,
    4. $user ); if ( count
    5. (
    6. $permErrors ) ) { 제목을 기준으로 사용자에게 페이지에 액세스할 수 있는 읽기 권한이 있는지 확인합니다. 권한이 부족할 경우 항목 페이지를 구성하고 돌아옵니다.

    // 모든 DB 및 지연 업데이트가 발생하거나 발생하지 않아야 합니다.

    // 클라이언트 연결 끊김으로 인해 나중에 취소하면 안 됩니다.

    PHP 코드

    ignore_user_abort( true )

      PHP에서 제공하는 기능으로 true로 설정하면 사용자와의 연결 끊김을 무시합니다. PHP는 클라이언트에 정보를 보내려고 시도할 때까지 사용자의 연결이 끊어졌는지 감지하지 못합니다.

      // 이제 모든 트랜잭션을 커밋하여

      // 출력() 이후에 보고되지 않은 오류가 전체 DB 트랜잭션을 롤백하지 않도록 합니다.

      PHP 코드

      1. wfGetLBFactory()->commitMasterChanges()

      제출된 사항은 오류가 있을 경우 롤백됩니다.

      //모두 출력!

      PHP 코드

      1. $this->context->getOutput()->output()

      페이지가 첫 페이지로 출력됩니다. , 여기 문장 앞의 모든 데이터에는 스타일이 포함되지 않습니다. 워드 코드 실행은 반환 데이터 유형에 따라 다른 스킨을 추가합니다.

      PHP 코드

      1. wfProfileOut( __METHOD__ )

      위 내용을 포함하여 mediawiki1.24 소스코드 분석(1)을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.