mediawiki源碼分析-入口Index.php簡要分析

轉自 donnki 個人空間 : http://www.phpchina.com/52027/viewspace_20042.html Wiki源碼裏註釋挺完整的,基本上每一個文件和類的作用,每一個方法的參數、返回值都寫清楚了,每一個常量、全局變量也都有詳細的註釋。另外代碼片段的作用也有註釋。 而且作者很有意思。看這段註釋,哈哈: // This probably shouldn't even happen. ohh man, oh yuck. // But for interwiki transclusion it sometimes does. // Shit. Shit shit shit. 現在從入口index.php來分析MediaWiki源碼。 index.php源文件全部內容如下: getVal( 'maxlag' ); if ( !is_null( $maxLag ) ) { if ( !$mediaWiki->checkMaxLag( $maxLag ) ) { exit; } } # Query string fields $action = $wgRequest->getVal( 'action', 'view' ); $title = $wgRequest->getVal( 'title' ); $wgTitle = $mediaWiki->checkInitialQueries( $title,$action,$wgOut, $wgRequest, $wgContLang ); if ($wgTitle == NULL) { unset( $wgTitle ); } # # Send Ajax requests to the Ajax dispatcher. # if ( $wgUseAjax && $action == 'ajax' ) { require_once( $IP . '/includes/AjaxDispatcher.php' ); $dispatcher = new AjaxDispatcher(); $dispatcher->performAction(); $mediaWiki->restInPeace( $wgLoadBalancer ); exit; } wfProfileOut( 'main-misc-setup' ); # Setting global variables in mediaWiki $mediaWiki->setVal( 'Server', $wgServer ); $mediaWiki->setVal( 'DisableInternalSearch', $wgDisableInternalSearch ); $mediaWiki->setVal( 'action', $action ); $mediaWiki->setVal( 'SquidMaxage', $wgSquidMaxage ); $mediaWiki->setVal( 'EnableDublinCoreRdf', $wgEnableDublinCoreRdf ); $mediaWiki->setVal( 'EnableCreativeCommonsRdf', $wgEnableCreativeCommonsRdf ); $mediaWiki->setVal( 'CommandLineMode', $wgCommandLineMode ); $mediaWiki->setVal( 'UseExternalEditor', $wgUseExternalEditor ); $mediaWiki->setVal( 'DisabledActions', $wgDisabledActions ); $wgArticle = $mediaWiki->initialize ( $wgTitle, $wgOut, $wgUser, $wgRequest ); $mediaWiki->finalCleanup ( $wgDeferredUpdateList, $wgLoadBalancer, $wgOut ); # Not sure when $wgPostCommitUpdateList gets set, so I keep this separate from finalCleanup $mediaWiki->doUpdates( $wgPostCommitUpdateList ); $mediaWiki->restInPeace( $wgLoadBalancer ); ?> 第一句:require_once( './includes/WebStart.php' ); Webstart.php文件執行的操作是爲一個Web請求進行初始化設置:進行安全檢查、調試開啓(注1)、裝載配置文件裏的全局變量及常量。最後調用setup.php執行後繼操作(注2)。 這個文件中調用了Defines.php(常量)、LocalSettings.php(配置文件,全局變量。),另外還在這裏根據配置開啓字符緩衝區,回調方法是OutputHandler.php的wfOutputHandler方法。 setup.php裏require_once了一大堆文件:AutoLoader.php、Exception.php、GlobalFunctions.php、Hooks.php、Namespace.php、ProxyTools.php、ObjectCache.php、ImageFunctions.php、StubObject.php……另外還初始化了一些重要的全局變量如$wgLoadBalancer、$wgUser、$wgRequest等。 接下來: require_once( "includes/Wiki.php" ); $mediaWiki = new MediaWiki(); wiki.php裏定義了MediaWiki類。其中包括很多的wiki對象的方法。接着爲$mediaWiki對象開闢內存空間。MediaWiki類的構造函數只有一句:$this->GET = $_GET;(類成員變量$GET存放$_GET的信息。應該是爲了讓面向對象來得很徹底吧,呵呵) 接下來,經過一步驗證$maxLag(暫時不知道是做何用的)後,從已經在setup.php中初始化的$wgRequest對象中取中事件類型$action和主題$title。在這裏我將$wgRequest對象對應的WebRequest類理解成封裝$_REQUEST數組的類。然後以$action、$title及其它上下文作爲參數通過$mediaWiki->checkInitialQueries取得一個Title對象。 AJAX判斷。如果開啓AJAX功能,且$action值爲ajax,則將Ajax請求發送到Ajax dispather處理器。這裏由於我沒開啓ajax功能,所以暫時沒從這裏跟蹤進去。 接下來,爲$mediaWiki的成員變量數組$param設置了很多的值(暫時未具體瞭解其意圖)。 $wgArticle = $mediaWiki->initialize ( $wgTitle, $wgOut, $wgUser, $wgRequest ); 這一句應該比較關鍵。源碼註釋上寫的是初始化一切! Initialization of ... everything,注意initialize()方法中調用了這麼一段: $article = $this->initializeArticle( $title, $request ); if( is_object( $article ) ) { $this->performAction( $output, $article, $title, $user, $request ); }elseif( is_string( $article ) ) { $output->redirect( $article ); } else { throw new MWException( "Shouldn't happen: MediaWiki::initializeArticle() returned neither an object nor a URL" ); } 這裏的performAction()應該是處理不同的action請求。默認的$action爲"view",因此暫未跟蹤入這個方法體裏。 最後返回一個Article對象,或者爲NULL。 $mediaWiki->finalCleanup ( $wgDeferredUpdateList, $wgLoadBalancer, $wgOut ); 處理延期的更新、寫入數據庫及爲頁面輸出。 由於不確定$wgPostCommitUpdateList是否已經取得了結果集,因此單獨執行$mediaWiki->doUpdates( $wgPostCommitUpdateList )進行最後的清理工作。 最後調用restInPeace()友好的關閉數據庫連接。 注1:這裏我不確定。原文是“start the profiler”,爲其定義了wfProfileIn和wfProfileOut兩個方法。從上下文來看應該是做調試用的。我沒開啓調試功能,所以在$haveProctitle=function_exists("setproctitle");(來源於ProfileStub.php)我全文搜索"function setproctitle"沒搜到,因此$haveProctitle值爲false,在後文的判斷中沒執行任何操作。也即沒開啓調試吧。 注2:是否調用setup.php取決於常量“MW_NO_SETUP”是否被定義: if ( !defined( 'MW_NO_SETUP' ) ) { require_once( './includes/Setup.php' ); }更爲詳細的分析具體的方法體,有待進一步研究。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章