所有分析說明採用文字使用淺紅色、小四號楷體。
Index.php
//mediawiki程序入口
This is the main web prypoint forforforiaWiki 程式碼,判斷PHP版本是否是5.3.2以上,如果不是就在頁面報錯提示。
Php代碼
if
( !function_exists( 'version_compare'.55)' - ) // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
- ionError.php';
wfPHPVersionError( - ' index.php' ); }
- 接下來是比較關鍵的程式碼了,並引入一個PHP檔案 Webstart.php。
- Php代碼
require __DIR__ . '/includes/WebStart.'
.
* This does the initial set up for a web request.- * 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.' );
}
- 項
# bug 15461: Make IE8 turn off content sniffing. Every so that it's *always* set, even for alternate entry- # points and when $wgOut gets disabled or overridden.
- Php程式碼 )ons:o);
- 針對IE8進行關閉內容嗅探,大家應該要忽略這個
Php代碼
- $wgRequestTime = microtime( Unix 時間戳記和微秒數。
Php程式碼
unset( $IP );
點 hp代碼
-
define( 'MEDIAWIKI'
, true );
定義一個常量mediawiki
# Full path 並且對容積# Full path pibleatdiop. le to have effective exclude path in -
apc.
# __DIR__ breaks symlinked
includes, but realpath missions on parent directories.
Php代碼
$IP = getenv( 'MW_INSTALL_PATH' );
$IP =
realpath( ' .'
) ?: dirname( __DIR__ );
- } 透過取得PH
- 透過取得PH
- 透過取得PH透過取得PH
-
透過取得PH
的安裝環境變數,取得安裝的安裝目錄。
# Load the profiler
Php代碼
Php代碼/ er.php";
-
$wgRUstart = wfGetRusage() ?: array();
- ...
#PStart theStarttheprotheyat .php。根據上下文來看ProfilerStub.php裡定義的兩個主要的函數wfProfileIn()、wfProfileOut()應該是做Debug用的。
Php代碼
$wgProfiler =
array(); (
"$IP/StartProfiler.php"
) ) { - require"$IP/StartProfiler.php";
-
} 'MW_NO_SETUP' ) ) {
- require_once"$IP/includes/Setup.php";
} -
. ,主要用於DEBUG調試使用)、AutoLoader.php(類別管理器,類似JAVA中SPRING的IOC容器)、Defines.php、StartProfiler.php、DefaultSettings.php、autoload.php、NoLocalSettings.php、OutputHandler.php、Setup.php…
- 接下來到了程式業務處理入口:
Php程式碼 - Php程式碼
);
$mediaWiki-> run();
Mediawiki.php
mediawiki.php裡定義了MediaWiki類別。其中包括很多的wiki物件的方法。接著為$mediaWiki物件開啟記憶體空間。
Php代碼
-
publicfunction __construct( IContext if ( !
$context- ) { $ context = RequestContext::getMain();
- }
-
-
$this->config =
$ context- ->getConfig(); }
- 透過建構方法,取得request請求物件、設定資訊。
Php代碼
//請求中如果包含延遲請求,和系統最後一次操作時間對比。如果最後一次操作時間大於請求最大延遲,則提示逾時。
$this- ->checkMaxLag(); try {
- try {
-
- $this->main();
- } catch ( ErrorPageError 🜎$ ug 62091: while exceptions are convenient to bubble up GUI errors,
- // they are not internal application faults. As with normal requests, this updates, jobs, and profiling.
- wfGetLBFactory ()->commitMasterChanges();
- $e->report(); // display the GUI error
-
( function_exists( 'fastcgi_finish_request' ) ) {
- fastcgi_finish_request();
- } $this->restInPeace();
-
} catch ( Exception
$e- ) { MWExceptionHandler::handle( $e );
}-
現在進入關鍵方法main()方法 - // Send Ajax requests to the Ajax dispatcher.
-
if
( - -$ getVal( 'action' ,
'view'- ) == 'ajax' ) {
- 我 break things
-
$title = Title::makeTitle( NS_MAIN,
'AJAX'- );
$this- ->context->setTitle( Title = $title
;
- $dispatcher = new AjaxDispatcher( $this. formAction(
$this- ->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- (
$request- ->getProtocol() == 'http' && wfProfileOut( __METHOD__
); -
- return;
- }
} -
-
Php代碼
-
if ( $this->config->get( 'UseFileCache'
) && $ti fProfileIn( 'main-try -filecache' );
...
wfProfileOut( - 'main-try-filecache'); 判斷配置是否開啟檔案快取功能,並且命名空間大於等於1的情況,使用檔案快取機制相關功能。
-
- 1
-
Special:
1
Talk: 2
|
User: |
| 4
| Test:
5
| Test_talk:
|
7 |
Image_ |
8
| MediaWiki: iki |
10 |
Template: |
11
| Template_talk:
|
13 |
Help_talk: |
14 |
Category: |
Category_talk: |
16 |
16 |
// Actually do the work of the request and build up any output
->performRequest();
處理請求的工作和建立輸出。在此方法會生程一個輸出物件$output,此物件有對應方法可以設定不同的輸出結果。 -
Php代碼
wfProfileIn( __METHOD__
); Out( __METHOD__ )追蹤發現為啟動DEBUG模式後,進行對應資料的列印。開啟列印方法LocationSettings.php裡設定
$wgDebugLogFile=d:a.txt
值。注意:wfProfileIn和wfProfileOut需要成對出現,否則會出錯。而且調試資訊的輸出順序是:先輸出已經匹配好了的一對wfProfileIn和wfProfileOut的調試信息,也即遇到wfProfileOut時才輸出該段調試信息,而不是wfProfileIn。 。 - Php程式碼
if ( $request-
$output
-> setPrintable();
- } 判斷請求是否有列印請求。如果有就在輸出物件中進行標註。
Php代碼 $unused- = null; // 'BeforeInitialize'
,
array( &$title, &$unused
, &$output, &
$user
, $request, - $this ) );這個屬於系統鉤子程序,應該需要插件進行實現BeforeInitialize方法,我全文搜尋沒有此方法的具體實用。 // Check user's permissions to read this page.
-
// We have to check here // We have will check again in Article::view(). Php代碼 $permErrors = $title->is5? array()
// relies on HMAC key signature alone
:
$title->getUserPermissionsErrors( 'read',
$user ); $permErrors ) ) {
根據title進行判斷使用者是否有次頁面的存取read權限。如果權限不足建構項頁面進行傳回。
- // Either all DB and deferred upcom not be cancelled due to client disconnect.
-
Php代碼 ignore_user_abort( true );
PHP提供的函數,若設定為 true,則忽略與使用者之間的斷開。 PHP 不會偵測到使用者是否已斷開連接,直到嘗試傳送訊息至客戶端。
// Now commit any transactions, so that unreported errors after
// out Php代碼
wfGetLBFactory()- >commitMasterChanges();
事物提交,並有錯誤進行回滾。
// Output everything!
Php代碼
>this;
- 頁面輸出到前台頁面,在此句之前所有資料不攜帶樣式。詞句代碼執行會按返回資料類型進行添加不同的skin。
Php代碼
wfProfileOut(
__METHOD__ );
__METHOD__ ); -
以上就介紹了mediawiki1.24源碼分析(一) ,包含了方面的內容,希望對PHP教程有興趣的朋友有所幫助。