首頁  >  文章  >  後端開發  >  mediawiki1.24原始碼分析(一)

mediawiki1.24原始碼分析(一)

WBOY
WBOY原創
2016-08-08 09:26:521756瀏覽

所有分析說明採用文字使用淺紅色、小四號楷體。

Index.php

//mediawiki程序入口

This is the main web prypoint forforforiaWiki 程式碼,判斷PHP版本是否是5.3.2以上,如果不是就在頁面報錯提示。

Php代碼 

if

 ( !function_exists( 'version_compare'
    .55)'
  1.  ) // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
  2. ionError.php';  
  3. wfPHPVersionError( 
  4. ' index.php' );  }  
  5. 接下來是比較關鍵的程式碼了,並引入一個PHP檔案 Webstart.php。
  6. Php代碼 

require __DIR__ . '/includes/WebStart.'

.

     * This does the initial set up for a web request.
  1.  * It does some security checks, starts the profiler and loads the ther
 * MW_NO_SETUP is defined.

 * Setup.php (if loaded) then sets up GlobalFunctions, the AutoLoader,

 * and the configur 

WebStart.php的文件註解部分如上,大概說此檔案執行的操作是為一個Web請求進行初始化設定:進行安全檢查、調試開啟、裝載設定檔裡的全域變數及常數。最後如果沒有安裝過mediawiki則呼叫setup.php執行安裝mediawiki操作。這個檔案中呼叫了Defines.php(常數)、LocalSettings.php(設定文件,全域變數),另外還在這裡根據配置開啟字元緩衝區,回呼方法是OutputHandler.php的wfOutputHandler方法。

Php代碼 

_p  ) ) {  

die'MediaWiki does not support installations where register_globals is enabled. where register_globals is enabled. where register_globals is enabled. where register_globals is enabled. where register_globals is enabled. where register_globals is enabled. where register_globals is enabled. where register_globals is enabled. where register_globals is enabled. where register_globals is enabled. '

'Please see 'for help on how to disable it.' );  

}  

  1. # bug 15461: Make IE8 turn off content sniffing. Every so that it's *always* set, even for alternate entry
  2. # points and when $wgOut gets disabled or overridden.
  3. Php程式碼 🠎)🠎ons:o); 
  4. 針對IE8進行關閉內容嗅探,大家應該要忽略這個

    Php代碼 

    1. $wgRequestTime = microtime( Unix 時間戳記和微秒數。

    Php程式碼 

    unset( $IP

     );  

    點 hp代碼 
    1. define( 'MEDIAWIKI'
    2. , true );  

    定義一個常量mediawiki

    # Full path   並且對容積
      # Full path pibleatdiop. le to have effective exclude path in 
    1. apc.
    # __DIR__ breaks 

    symlinked

     includes, but 

    realpath missions on parent directories.

    Php代碼 

    $IP = getenv'MW_INSTALL_PATH' );  

    $IP = 

    realpath

    ' .'

     ) ?: dirname( __DIR__ );  

    1. }  透過取得PH
    2. 透過取得PH
    3. 透過取得PH透過取得PH
    4. 透過取得PH
    5. 的安裝環境變數,取得安裝的安裝目錄。

    # Load the profiler

    Php代碼 

    Php代碼/ er.php";  
    1. $wgRUstart = wfGetRusage() ?: array();  
    2. ...
    #PStart theStarttheprotheyat .php。根據上下文來看ProfilerStub.php裡定義的兩個主要的函數wfProfileIn()、wfProfileOut()應該是做Debug用的。

    Php代碼 

    $wgProfiler = 

    array(); 

    "$IP/StartProfiler.php"

     ) ) {  
    1. require"$IP/StartProfiler.php";  
    2. }   'MW_NO_SETUP' ) ) {  
    3. require_once"$IP/includes/Setup.php";  
    4. }  
    5. . ,主要用於DEBUG調試使用)、AutoLoader.php(類別管理器,類似JAVA中SPRING的IOC容器)、Defines.php、StartProfiler.php、DefaultSettings.php、autoload.php、NoLocalSettings.php、OutputHandler.php、Setup.php…
    6. 接下來到了程式業務處理入口: 
    7. Php程式碼 
    8. Php程式碼 
    9. );  
    $mediaWiki-> run();  

    Mediawiki.php

     mediawiki.php裡定義了MediaWiki類別。其中包括很多的wiki物件的方法。接著為$mediaWiki物件開啟記憶體空間。

    Php代碼 

    1. publicfunction __construct( IContext if ( !
    2. $context
    3.  ) {  $ context = RequestContext::getMain();  
    4. }  
    5. $this->config = 
    6. $ context
    7. ->getConfig();  }  
    8. 透過建構方法,取得request請求物件、設定資訊。
    9. Php代碼 

    //請求中如果包含延遲請求,和系統最後一次操作時間對比。如果最後一次操作時間大於請求最大延遲,則提示逾時。

      $this
    1. ->checkMaxLag();  try {  
    2. try {  
    3. $this->main();  
    4. } catch ( ErrorPageError 🜎$ ug 62091: while exceptions are convenient to bubble up GUI errors,
    5. // they are not internal application faults. As with normal requests, this updates, jobs, and profiling.
    6. wfGetLBFactory ()->commitMasterChanges();  
    7. $e->report(); // display the GUI error
    8.  ( function_exists( 'fastcgi_finish_request' ) ) {  
    9. fastcgi_finish_request();  
    10. }   $this->restInPeace();  
    11. } catch ( Exception 
    12. $e
    13.  ) {  MWExceptionHandler::handle( $e );  
    14. }
    15. 現在進入關鍵方法main()方法  
    16. // Send Ajax requests to the Ajax dispatcher.
    17. if
    18.  ( 
    19. -$ getVal( 'action'
    20. 'view'
    21.  ) == 'ajax' ) {  
    22. 我 break things
    23. $title = Title::makeTitle( NS_MAIN, 
    24. 'AJAX'
    25.  );  
    26. $this
    27. ->context->setTitle( Title = $title
    28. ;
    29. $dispatcher = new AjaxDispatcher( $this. formAction( 
    30. $this
    31. ->context->getUser( ) );  wfProfileOut( __METHOD__ );  

      判斷是否啟用AJAX請求,且請求中$action值為ajax,則將Ajax請求傳送至Ajax dispather處理器。

      If the user has forceHTTPS set to true, or if the user

      /

      // preference set, redirect them to HTTPS.

      // Note: Do this after $wgTitle is setup, otherwise the hooks run from

      Php代碼 

        if
      1.  (  
      2. $request
      3. ->getProtocol() == 'http' && wfProfileOut( __METHOD__
      4.  );  
      5. return;  
      6. }  
      7. }  
      8. Php代碼 
      if ( 

      $this->config->get( 'UseFileCache'

       ) && $ti fProfileIn( 

      'main-try -filecache' );  

      ...  

        wfProfileOut( 
      1. 'main-try-filecache'); 判斷配置是否開啟檔案快取功能,並且命名空間大於等於1的情況,使用檔案快取機制相關功能
      2. - 1
      3. Special:        

      1

         4Test:    5Test_talk:      8MediaWiki:      11Template_talk:  

      // Actually do the work of the request and build up any output 

      ->performRequest();  

        處理請求的工作和建立輸出。在此方法會生程一個輸出物件$output,此物件有對應方法可以設定不同的輸出結果。
      1. Php代碼 

      wfProfileIn( __METHOD__

       );   Out( __METHOD__ )追蹤發現為啟動DEBUG模式後,進行對應資料的列印。開啟列印方法LocationSettings.php裡設定

      $wgDebugLogFile=d:a.txt

      值。注意:wfProfileIn和wfProfileOut需要成對出現,否則會出錯。而且調試資訊的輸出順序是:先輸出已經匹配好了的一對wfProfileIn和wfProfileOut的調試信息,也即遇到wfProfileOut時才輸出該段調試信息,而不是wfProfileIn。 。
      1. Php程式碼 

      if ( $request-

      $output

      -> setPrintable();  

      1. }  判斷請求是否有列印請求。如果有就在輸出物件中進行標註。
      2. Php代碼 
      3. $unused
      4.  = null; // 'BeforeInitialize'
      array( &

      $title, &$unused

      , &$output

      , &

      $user

      , $request
      1. $this ) );這個屬於系統鉤子程序,應該需要插件進行實現BeforeInitialize方法,我全文搜尋沒有此方法的具體實用。 // Check user's permissions to read this page.
      2. // We have to check here // We have  will check again in Article::view(). Php代碼 $permErrors = $title->is5? array() 
      3. // relies on HMAC key signature alone

      $title

      ->getUserPermissionsErrors( 'read'

      $user

       ); $permErrors ) ) {  

      根據title進行判斷使用者是否有次頁面的存取read權限。如果權限不足建構項頁面進行傳回。

      1. // Either all DB and deferred upcom not be cancelled due to client disconnect.
      2. Php代碼  ignore_user_abort( true );  
      3. PHP提供的函數,若設定為 true,則忽略與使用者之間的斷開。 PHP 不會偵測到使用者是否已斷開連接,直到嘗試傳送訊息至客戶端。

        // Now commit any transactions, so that unreported errors after

        // out Php代碼 

        wfGetLBFactory()- >commitMasterChanges();  
        1. 事物提交,並有錯誤進行回滾。

        // Output everything!

        Php代碼 

        >this;
        1. 頁面輸出到前台頁面,在此句之前所有資料不攜帶樣式。詞句代碼執行會按返回資料類型進行添加不同的skin。
        2. Php代碼 

        wfProfileOut( 

        __METHOD__ );  

        __METHOD__ );  
        1. 以上就介紹了mediawiki1.24源碼分析(一) ,包含了方面的內容,希望對PHP教程有興趣的朋友有所幫助。
      Talk:       

      2

      User:           

           

      7

      Image_ 

      iki

      10

      Template:       

             

      13

      Help_talk:   

      14

      Category:       

      Category_talk:  

      16

      16

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn