`
qepwqnp
  • 浏览: 115185 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

mediawiki1.24源码分析(一)

PHP 
阅读更多

所有分析说明采用文字使用浅红色、小四号楷体。

Index.php

//mediawiki程序入口

This is the main web entry point for MediaWiki. 

现在开始看程序的第一句代码,判断PHP版本是否是5.3.2及以上,如果不是就在页面报错提示。

 

Php代码 
  1. if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {  
  2. // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+  
  3. require dirname( __FILE__ ) . '/includes/PHPVersionError.php';  
  4. wfPHPVersionError( 'index.php' );  
  5. }  

 

 

接下来是比较关键的代码了,引入一个PHP文件 Webstart.php。

 

Php代码 
  1. require __DIR__ . '/includes/WebStart.php';  

 

 

Webstart.php

 * This does the initial set up for a web request.

 * It does some security checks, starts the profiler and loads the

 * configuration, and optionally loads Setup.php depending on whether

 * MW_NO_SETUP is defined.

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

 * and the configuration globals (though not $wgTitle).

 

WebStart.php的文件注解部分如上,大概说此文件执行的操作是为一个Web请求进行初始化设置:进行安全检查、调试开启、装载配置文件里的全局变量及常量。最后如果没有安装过mediawiki则调用setup.php执行安装mediawiki操作。这个文件中调用了Defines.php(常量)、LocalSettings.php(配置文件,全局变量),另外还在这里根据配置开启字符缓冲区,回调方法是OutputHandler.php的wfOutputHandler方法。 

 

 

 

Php代码 
  1. if ( ini_get'register_globals' ) ) {  
  2. die'MediaWiki does not support installations where register_globals is enabled. '  
  3. 'Please see <a href="https://www.mediawiki.org/wiki/register_globals">mediawiki.org</a> '  
  4. 'for help on how to disable it.' );  
  5. }  

 

 

如果PHP配置项register_globals是打开状态(ON),则mediawiki无法运行。

 

# bug 15461: Make IE8 turn off content sniffing. Everybody else should ignore this

# We're adding it here so that it's *always* set, even for alternate entry

# points and when $wgOut gets disabled or overridden.

 

Php代码 
  1. header( 'X-Content-Type-Options: nosniff' );  

 

 

针对IE8进行关闭内容嗅探,大家应该应该忽略这个

 

 

Php代码 
  1. $wgRequestTime = microtime( true );  

 

 

 函数返回当前 Unix 时间戳和微秒数。

 

Php代码 
  1. unset( $IP );  

 

 

注销定义$IP的变量

 

Php代码 
  1. define( 'MEDIAWIKI', true );  

 

 

定义一个常量mediawiki

# Full path to working directory.

# Makes it possible to for example to have effective exclude path in apc.

# __DIR__ breaks symlinked includes, but realpath() returns false

# if we don't have permissions on parent directories.

 

Php代码 
  1. $IP = getenv'MW_INSTALL_PATH' );  
  2. if ( $IP === false ) {  
  3. $IP = realpath'.' ) ?: dirname( __DIR__ );  
  4. }  

 

 

通过获取PHP的环境变量,获取安装的安装目录。

 

# Load the profiler

 

Php代码 
  1. require_once "$IP/includes/profiler/Profiler.php";  
  2. $wgRUstart = wfGetRusage() ?: array();  

 

 

...

# Start the profiler

//StartProfiler.php文件里只调用了ProfilerStub.php。根据上下文来看ProfilerStub.php里定义的两个主要的函数wfProfileIn()、wfProfileOut()应该是做Debug用的。

 

Php代码 
  1. $wgProfiler = array();  
  2. if ( file_exists"$IP/StartProfiler.php" ) ) {  
  3. require "$IP/StartProfiler.php";  
  4. }  
  5. ...  
  6. if ( !defined( 'MW_NO_SETUP' ) ) {  
  7. require_once "$IP/includes/Setup.php";  
  8. }  

 

 

 

require_once了一大堆文件:Profiler.php(分析其,主要用于DEBUG调试使用)、AutoLoader.php(类管理器,类似JAVA中SPRING的IOC容器)、Defines.php、StartProfiler.php、DefaultSettings.php、autoload.php、NoLocalSettings.php、OutputHandler.php、Setup.php……

 

接下来到了程序业务处理入口: 

 

Php代码 
  1. $mediaWiki = new MediaWiki();  
  2. $mediaWiki->run();  

 

 

Mediawiki.php

 

 mediawiki.php里定义了MediaWiki类。其中包括很多的wiki对象的方法。接着为$mediaWiki对象开辟内存空间。

 

Php代码 
  1. public function __construct( IContextSource $context = null ) {  
  2. if ( !$context ) {  
  3. $context = RequestContext::getMain();  
  4. }  
  5.    
  6. $this->context = $context;  
  7. $this->config = $context->getConfig();  
  8. }  

 

 

通过构造方法,获取request请求对象、配置信息。

 

Php代码 
  1. public function run() {  
  2. try {  
  3. //请求中如果包含延迟请求,和系统最后一次操作时间对比。如果最后一次操作时间大于请求最大延迟,则提示超时。  
  4. $this->checkMaxLag();  
  5. try {  
  6. //关键方法,主要做业务流转相关操作。  
  7. $this->main();  
  8. } catch ( ErrorPageError $e ) {  
  9. // Bug 62091: while exceptions are convenient to bubble up GUI errors,  
  10. // they are not internal application faults. As with normal requests, this  
  11. // should commit, print the output, do deferred updates, jobs, and profiling.  
  12. wfGetLBFactory()->commitMasterChanges();  
  13. $e->report(); // display the GUI error  
  14. }  
  15. if ( function_exists( 'fastcgi_finish_request' ) ) {  
  16. fastcgi_finish_request();  
  17. }  
  18. $this->triggerJobs();  
  19. $this->restInPeace();  
  20. } catch ( Exception $e ) {  
  21. MWExceptionHandler::handle( $e );  
  22. }  
  23. }  
  24. 现在进入关键方法main()方法  
  25. // Send Ajax requests to the Ajax dispatcher.  
  26. if ( $this->config->get( 'UseAjax' ) && $request->getVal( 'action''view' ) == 'ajax' ) {  
  27.    
  28. // Set a dummy title, because $wgTitle == null might break things  
  29. $title = Title::makeTitle( NS_MAIN, 'AJAX' );  
  30. $this->context->setTitle( $title );  
  31. $wgTitle = $title;  
  32.    
  33. $dispatcher = new AjaxDispatcher( $this->config );  
  34. $dispatcher->performAction( $this->context->getUser() );  
  35. wfProfileOut( __METHOD__ );  
  36. return;  
  37. }  

 

判断是否启用AJAX请求,并且请求中$action值为ajax,则将Ajax请求发送到Ajax dispather处理器。

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

// is in a group requiring HTTPS, or if they have the HTTPS

// preference set, redirect them to HTTPS.

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

// isLoggedIn() will do all sorts of weird stuff.

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

 

如果forcehttps设置为true,并且使用https访问,进行重定项处理

 

Php代码 
  1. if ( $this->config->get( 'UseFileCache' ) && $title->getNamespace() >= 0 ) {  
  2. wfProfileIn( 'main-try-filecache' );  
  3. ...  
  4. wfProfileOut( 'main-try-filecache' );  
  5. }  

 

判断配置是否开启文件缓存功能,并且命名空间大于等于1的情况,使用文件缓存机制相关功能

 

命名空间值

命名空间值含义

-1

Special:        

0

Template:       

1

Talk:           

2

User:           

3

User_talk:      

4

Test:           

5

Test_talk:      

6

Image:          

7

Image_talk:     

8

MediaWiki:      

9

MediaWiki_talk: 

10

Template:       

11

Template_talk:  

12

Help:           

13

Help_talk:      

14

Category:       

15

Category_talk:  

16

ONLINEPAY

 

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

Php代码 
  1. $this->performRequest();  

 

处理请求的工作和建立输出。在此方法会生程一个输出对象$output,此对象有相应方法可以设置不同的输出结果。

Php代码 
  1. wfProfileIn( __METHOD__ );  

 

方法第一句,发现mediawiki中基本方法入口都要这么一句,他的后面出现wfProfileOut( __METHOD__ )跟踪发现为启动DEBUG模式后,进行相应数据的打印。开启打印方法LocationSettings.php里设置$wgDebugLogFile=d:\a.txt值。注意:wfProfileIn和wfProfileOut需要成对出现,否则会出错。而且调试信息的输出顺序是:先输出已经匹配好了的一对wfProfileIn和wfProfileOut的调试信息,也即遇到wfProfileOut时才输出该段调试信息,而不是wfProfileIn。。 

Php代码 
  1. if ( $request->getVal( 'printable' ) === 'yes' ) {  
  2. $output->setPrintable();  
  3. }  

 

判断请求是否有打印请求。如果有就在输出对象中进行标注。

Php代码 
  1. $unused = null; // To pass it by reference  
  2. wfRunHooks( 'BeforeInitialize'array( &$title, &$unused, &$output, &$user$request$this ) );  

 

通过请求对象,进行初始化之前的检查工作。这个属于系统钩子程序,应该需要插件进行实现BeforeInitialize方法,我全文搜索没有此方法的具体实用。

// Check user's permissions to read this page.

// We have to check here to catch special pages etc.

// We will check again in Article::view().

Php代码 
  1. $permErrors = $title->isSpecial( 'RunJobs' )  
  2. array() // relies on HMAC key signature alone  
  3. $title->getUserPermissionsErrors( 'read'$user );  
  4. if ( count$permErrors ) ) {  

 

根据title进行判断用户是否有次页面的访问read权限。如果权限不足构造项页面进行返回。

 

 

// Either all DB and deferred updates should happen or none.

// The later should not be cancelled due to client disconnect.

Php代码 
  1. ignore_user_abort( true );  

 

PHP提供的函数,如果设置为 true,则忽略与用户的断开。PHP 不会检测到用户是否已断开连接,直到尝试向客户机发送信息为止。

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

// output() don't roll back the whole DB transaction

Php代码 
  1. wfGetLBFactory()->commitMasterChanges();  

 

事物提交,存在错误进行回滚。

// Output everything!

Php代码 
  1. $this->context->getOutput()->output();  

 

页面输出到前台页面,在此句之前所有数据不携带样式。词句代码执行会按返回数据类型进行添加不同的skin。

Php代码 
  1. wfProfileOut( __METHOD__ );  
分享到:
评论

相关推荐

    mediawiki源码分析-DefaultSettings变量说明

    ### MediaWiki源码分析——DefaultSettings变量说明 #### 一、概述 MediaWiki是一款非常流行的开源维基软件,被广泛应用于构建在线百科全书式的网站。为了满足不同场景下的需求,MediaWiki提供了丰富的配置选项来...

    MediaWiki使用MSUpload扩展上传文件功能

    MediaWiki是一个比较流行的wiki百科软件,部署使用都比较简单,容易上手。查看搜索都非常方便,但是编辑起来就比较麻烦,很多人不太习惯。而且很多知识都已经以word或excel、pdf等类型文档存放。重新输入到wiki中不...

    mediawiki-1.9.3cn.zip

    MediaWiki是一个强大、开源的维基引擎,广泛用于构建各种在线协作平台,如维基百科。在MediaWiki 1.9.3cn这个版本中,特别针对1.8版本存在的SQL创建表时设置默认值的问题进行了修复,从而提高了系统的稳定性和用户...

    MediaWiki Info

    这个“MediaWiki Info”压缩包可能包含了一系列关于MediaWiki的学习资料和配置示例,是深入理解并掌握这款强大软件的好资源。 MediaWiki的核心特性包括: 1. **易用性**:MediaWiki提供了一个直观的用户界面,使得...

    MediaWiki语法.pdf

    如果文章中含有3个以上标题,MediaWiki会自动在第一个标题之前生成目录(这是默认设置)。 **MediaWiki列表和缩进** 在MediaWiki中创建列表非常直观,使用特定符号即可: - 使用 `#` 号创建顺序列表,每增加一个 `...

    MediaWiKi linux Install package

    在Linux环境中安装MediaWiki,需要遵循一系列步骤,以确保所有依赖项都得到满足并正确配置。以下是对MediaWiki 1.18.1在Linux上安装过程的详细说明: 1. **系统要求**:首先,你需要一个运行Linux操作系统的服务器...

    mediaWiki1.23.6版本

    MediaWiki 1.23.6 是一个开源的、基于Web的wiki软件,它由维基媒体基金会开发并广泛用于创建协作式知识分享平台,如维基百科。这个版本是MediaWiki软件的一个重要里程碑,提供了许多功能改进和安全修复。 在...

    mediawiki-一个基于php的wiki工具

    MediaWiki的名字来源于“Media”(媒体)和“Wiki”(一种网页协作技术),它的目标是支持大规模的社区协作,让信息组织和更新变得更加高效。 ### MediaWiki的核心特性 1. **用户友好**:MediaWiki提供直观的用户...

    基于PHP的mediawiki-zhconverter基于mediawiki中文简繁互转源码.zip

    这个源码库是为了解决MediaWiki用户在处理多语言内容,尤其是涉及简体和繁体中文之间的转换问题而设计的。在本文中,我们将深入探讨这款工具的核心功能、工作原理以及如何在自己的MediaWiki站点上部署和使用它。 ...

    WYSIWYG_v1.20.2_MediaWiki_V1.21.*

    总的来说,"WYSIWYG_v1.20.2_MediaWiki_V1.21.*"是MediaWiki用户体验的一次重大提升,它利用CKEditor的易用性和功能,使编辑过程更加直观,降低了使用复杂性,同时保持了MediaWiki的核心优势——开放源码和强大的...

    Red Hat Linux 7.6 部署 MediaWiki 1.32.1.pdf

    MediaWiki的安装分为下载MediaWiki源码包并验证其完整性,然后运行MediaWiki安装程序,并创建与MySQL相关的数据库。这一步骤包括配置数据库连接,并填写必要的一些网站设置信息。 配置MediaWiki网页的步骤涉及设置...

    MediaWiki部署安装包

    2. **下载MediaWiki**:从官方网站或者Git仓库获取MediaWiki的最新稳定版源码,这里我们使用的是已包含皮肤的定制版安装包。 3. **解压文件**:将下载的MediaWiki压缩包解压到Web服务器的根目录下,例如 `/var/...

    MediaWiki 1.25.1.gz

    MediaWiki是一个运行在服务器端的自由软件,基于GNU General Public License(GPL协议)发行。它能够平稳地运行在日访问量上百万的网站服务器集群中。支持多国语言,包括简繁中文。MediaWiki是一个强大、可扩展、...

    PHP实例开发源码—MediaWiki Wiki 引擎.zip

    开发者可以通过分析源码学习如何实现高效的搜索算法和分类逻辑。 10. **国际化与本地化**: MediaWiki支持多语言,源码中包含了语言包和本地化设置。开发者可以通过学习如何处理多语言内容,为不同地区的用户提供...

    mediawiki环境搭建

    **MediaWiki环境搭建指南** ...以上步骤完成后,你便成功搭建了一个MediaWiki环境,可以开始创建属于自己的知识库了。记得定期更新MediaWiki以获取最新的安全补丁和功能。祝你在MediaWiki的使用过程中一切顺利!

    python-mediawiki-utilities, 用于访问和处理MediaWiki数据的一组实用程序.zip

    python-mediawiki-utilities, 用于访问和处理MediaWiki数据的一组实用程序 MediaWikiMediaWiki实用程序是 Aaron Halfaker开发的一个开源( MIT授权) 库,用于从MediaWiki安装。从数据库和xml转储中提取和处理数据。...

    mediawiki-EmailAddressImage-源码.rar

    Mediawiki是一个强大的开源wiki软件,它被广泛用于创建、管理和维护在线百科全书和协作项目。"EmailAddressImage"是Mediawiki的一个扩展,它主要用于保护网站上的电子邮件地址免受垃圾邮件机器人的扫描和滥用。这个...

    mediawiki-1.33.0部署程序.zip

    Mediawiki是一个强大的开源维基引擎,常用于创建和维护百科全书式网站,比如知名的Wikipedia就是基于Mediawiki构建的。本教程将详细讲解如何使用"mediawiki-1.33.0部署程序.zip"进行简单且直接的部署。 首先,我们...

Global site tag (gtag.js) - Google Analytics