0

0

mediawiki1.24源码分析(一)

php中文网

php中文网

发布时间:2016-08-08 09:26:52

|

2044人浏览过

|

来源于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' ) 
  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).

magento(麦进斗)
magento(麦进斗)

Magento是一套专业开源的PHP电子商务系统。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。Magento开源网店系统的特点主要分以下几大类,网站管理促销和工具国际化支持SEO搜索引擎优化结账方式运输快递支付方式客户服务用户帐户目录管理目录浏览产品展示分析和报表Magento 1.6 主要包含以下新特性:•持久性购物 - 为不同的

下载

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 mediawiki.org '
  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. publicfunction __construct( IContextSource $context = null ) {  
  2. if ( !$context ) {  
  3. $context = RequestContext::getMain();  
  4. }  
  5. $this->context = $context;  
  6. $this->config = $context->getConfig();  
  7. }  

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

Php代码 

  1. publicfunction 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. // Set a dummy title, because $wgTitle == null might break things
  28. $title = Title::makeTitle( NS_MAIN, 'AJAX' );  
  29. $this->context->setTitle( $title );  
  30. $wgTitle = $title;  
  31. $dispatcher = new AjaxDispatcher( $this->config );  
  32. $dispatcher->performAction( $this->context->getUser() );  
  33. wfProfileOut( __METHOD__ );  
  34. return;  
  35. }  

判断是否启用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__ );  

以上就介绍了mediawiki1.24源码分析(一) ,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

705

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

233

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

117

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

22

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

61

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

30

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

669

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

58

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号