知识点

1.init_get和init_set函数:获取和修改php运行环境的变量值,即存于php.ini中的值。

2.自动加载函数:discuz的class_core.php中有下面的代码,其作用是当我们在代码中引用不存在的类时,自动加载对应的类。这时__autoload就会被调用,并且类名会被作为参数传送过去。discuz的自动加载函数实现了自动加载source/class/目录下的类,避免了引用各种类文件的繁杂操作。

if(function_exists('spl_autoload_register')) {spl_autoload_register(array('core', 'autoload'));
} else {function __autoload($class) {return core::autoload($class);}
}

结构解析

Discuz结构庞大,功能繁杂,但是它整体大概可以分为以下几个模块(我使用的discuz版本是x3.2):

模块 功能
home 查看用户信息、私信、关注、道具、rss等功能
forum 跟论坛、版块、帖子相关的功能
member 用户登录相关的功能
plugin 插件相关的功能
group 用户群组相关的功能
portal 模块相关的功能
search 搜索相关的功能
admin 论坛管理模块
misc 其他功能

模块和模块之间有比较明显的分割界线,每个模块都和代码主目录下的代码文件一一对应。这些代码文件都是入口(后面简称入口),主要功能逻辑的代码实现位于source/module/目录下对应的目录中,如图:



各大模块的入口主要做的是一些初始化工作以及将请求转发到对应的功能模块中。下面我们分析下入口的功能。

class_core

所有的入口基本上都首先会执行下面的语句:

require './source/class/class_core.php';
...
$discuz = C::app();
...
$discuz->init();

class_core.php文件中首先设置了错误报告等级和异常处理机制,并且实现了自动加载函数(关于自动加载函数,我觉得这篇文章写得不错),代码如下:

error_reporting(E_ALL);
...
set_exception_handler(array('core', 'handleException'));if(DISCUZ_CORE_DEBUG) {set_error_handler(array('core', 'handleError'));register_shutdown_function(array('core', 'handleShutdown'));
}if(function_exists('spl_autoload_register')) {spl_autoload_register(array('core', 'autoload'));
} else {function __autoload($class) {return core::autoload($class);}
}

然后定义了discuz代码中经常用到的C类,其父类core实现了所有的功能,存放着一些静态变量和提供一些静态方法,扩展出一个子类C应该只是方便调用。

class C extends core {}

core类主要管理4个静态变量:

  1. $_tables:此变量存放了一些discuz_model和discuz_table类对象,用于数据库操作。获取discuz_model/discuz_table类对象的方法是m和t,即C::m($name)或C::t($name)。已经生成的对象会保存在$_tables中,避免多次创建对象。
  2. $_imports:此变量存放着已导入类的列表,用于前面提到的自动加载函数中,避免类被多次导入。
  3. $_memory:这个是缓存器,缓存类型可能是redis、memcache或者其他。提供了一些基础的缓存管理功能。
  4. $_app:discuz核心应用类对象,完成了各种初始化操作,保证discuz正确运行。

core.php中还创建了discuz_application类对象赋值给$_app,discuz_application类做了一些核心的初始化操作:

  1. _init_env:初始化环境变量,检查内存限制、检测爬虫和初始化全局变量$_G等。
  2. _init_config:初始化论坛设置,检测论坛是否安装完整、初始化authkey和初始化cookie目录等。
  3. _init_input:检查全局变量、过滤请求参数、合并GET/POST请求参数和设置盐值等。盐值用于生成authkey,用于验证用户身份。
  4. _init_output:初始化输出缓存和输出header等。

$discuz->init()的调用又做了以下一些操作:

  1. _init_db:初始化数据库连接。
  2. _init_setting:初始化设置,并加载设置、风格等缓存。
  3. _init_user:验证存于cookie的auth字段中的用户名密码或初始化访客身份信息及设置、检查购买的用户组是否过期和更新新消息数量等和用户相关的操作。
  4. _init_session:初始化用户session。
  5. _init_mobile:检查用户是否从移动端访问并决定是否跳转到移动端页面。
  6. _init_cron:检查并执行定时任务。
  7. _init_misc:执行xss检查、访问权限检查和登录超时检查等。

mod

字段mod确定了用户访问各大模块的哪个子功能。各个入口都会检查mod的合理性,如home.php中:

$mod = getgpc('mod');
if(!in_array($mod, array('space', 'spacecp', 'misc', 'magic', 'editor', 'invite', 'task', 'medal', 'rss', 'follow'))) {$mod = 'space';$_GET['do'] = 'home';
}

runhooks

每个入口都执行了一次runhooks函数,该函数内的主要代码如下,可以看出该函数是在执行某些插件相关的功能。

...
if($_G['setting']['plugins']['func'][HOOKTYPE]['common']) {hookscript('common', 'global', 'funcs', array(), 'common');
}
...

再看看hookscript函数的主要代码就比较明朗了,hookscript主要执行了在全局变量$_G中已设置的插件,并将返回值记录在全局变量$_G中。

 ...foreach((array)$_G['setting'][HOOKTYPE][$hscript][$script]['module'] as $identifier => $include) {if($_G['pluginrunlist'] && !in_array($identifier, $_G['pluginrunlist'])) {continue;}$hooksadminid[$identifier] = !$_G['setting'][HOOKTYPE][$hscript][$script]['adminid'][$identifier] || ($_G['setting'][HOOKTYPE][$hscript][$script]['adminid'][$identifier] && $_G['adminid'] > 0 && $_G['setting']['hookscript'][$hscript][$script]['adminid'][$identifier] >= $_G['adminid']);if($hooksadminid[$identifier]) {//引用插件类@include_once DISCUZ_ROOT.'./source/plugin/'.$include.'.class.php';}}...//执行插件类中的方法$return = $pluginclasses[$classkey]->$hookfunc[1]($param);...//记录执行方法的返回值foreach($return as $k => $v) {$_G['setting']['pluginhooks'][$hookkey][$k] .= $v;}

不过哪些插件功能会在程序入口处被执行呢,我追溯了一下$_G[‘setting’][‘plugins’][‘func’][HOOKTYPE][‘common’]的来源,确实是来自插件类,但是由于整个过程比较繁杂,我就不展开分析了。下面的代码是我在cache_setting.php中看到的,配合上下文代码看,大概可以证明runhooks中hook方法的来源,以后有空再专门分析discuz插件:

...
$data[$k][$hscript][$curscript]['funcs'][$funcname][] = array('displayorder' => $module['displayorder'], 'func' => array($plugin['identifier'], $funcname));
...

end

discuz模块入口的功能大概就前面写的这些,后面我们继续分析各大功能模块的功能。

Discuz论坛项目架构分析相关推荐

  1. RoadFlow项目架构分析

    RoadFlow开源工作流源码-项目架构分析 项目文件结构: 很明了一个标准的三层架构的系统. 表示层:Web 业务层:Business 数据访问层:Data 另外存在缓存层:Cache缓存 增加公共 ...

  2. RoadFlow开源工作流源码-项目架构分析

    项目文件结构: 很明了一个标准的三层架构的系统. 表示层:Web 业务层:Business 数据访问层:Data 另外存在缓存层:Cache缓存 增加公共使用类库:Utility 下面以一个实例(系统 ...

  3. b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释

    b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释 我最近一直在找适合将来用于公司大型bs,b2b b2c的基础架构. 实际情况是要建立一个bs架构b2b.b2c的网站,当然还包括w ...

  4. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释 继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更 ...

  5. 项目实战:ASP.NET:C/S架构 大学BBS论坛项目(推荐★★★)

    项目实战:ASP.NET:C/S架构  大学BBS论坛项目(推荐★★★) 目录 项目实战:ASP.NET:C/S架构  大学BBS论坛项目(推荐★★★) 编辑环境: 项目: 项目简介: 其他: 1.项 ...

  6. 采用lamp架构搭建discuz论坛

    lamp简介 LAMP指的Linux(操作系统).ApacheHTTP 服务器,MySQL(有时也指MariaDB,数据库软件) 和PHP(有时也是指Perl或Python) 的第一个字母,一般用来建 ...

  7. 大数据日志分析项目架构

    老是弹出由于您编辑时间过长,页面和服务器之间的连接已断开,请先将文章内容另外保存,再刷新本页面继续编辑让我保存页面我也是醉了,图片多没法一次上传,上传图片还一直失败,我只好都放在一个附件里面了.阿里能 ...

  8. LAMP架构及搭建LAMP+Discuz论坛

    LAMP架构及搭建LAMP+Discuz论坛的流程 1.LAMP架构概述 2.LAMP各组件的作用 3.LAMP的安装顺序 4.LAMP的数据流向 5.编译安装Apache 5.1 关闭防火墙和sli ...

  9. 饿了么开源项目Hermes跨进程架构分析1-服务端注册

    文章目录 1 注册实现 1.1 创建aidl文件 1.2 服务端实现 1.2.1 HermesService 1.2.2 创建Request和Responce 1.2.3 创建单例UserManage ...

  10. 饿了么开源项目Hermes跨进程架构分析2-客户端连接

    饿了么开源项目Hermes跨进程架构分析1-服务端注册 饿了么开源项目Hermes跨进程架构分析2-客户端连接 文章目录 2客户端连接 2.1 SecondActivity 2.2 Hermes 2. ...

最新文章

  1. Hibernate的一级缓存
  2. Udacity机器人软件工程师课程笔记(二十八) - 卷积神经网络实例 - Fashion-MNIST数据集
  3. python检查URL是否能正常访问
  4. springboot2 war页面放在那_成为微服务架构师--SpringBoot2学习笔记
  5. html解决空格显示问题
  6. Python基础:02数字
  7. 大话目标检测经典模型(RCNN、Fast RCNN、Faster RCNN)
  8. servlet html登录,Servlet实现用户登录
  9. Python 格式化输出 —— %r 与 %s 的区别(__repr__ 与 __str__)
  10. 在Qt中调用python,读取csv文件,实现K近邻算法(二)
  11. 2月10日 感知器+浅层神经网络+反向传播+tensorflow
  12. [复习计划]IMS5024
  13. Windows Server 2003 R2中的DFS复制与管理
  14. MVC多用户B2C商城系统源码分享
  15. (学习笔记)图像处理——同态滤波
  16. http://www.spiceworks.com
  17. 嵌入式系统开发笔记0_0:目录
  18. 狼牙月下----纳兰的、执子之手,生死勿离
  19. 20190904携程机试
  20. Hadoop 命令操作大全

热门文章

  1. 人均瑞数系列,瑞数 4 代 JS 逆向分析
  2. 小米手机html格式怎么打开,小米手机打开HTML用WPS
  3. 分享240道有意思的逻辑思维题
  4. 数学建模matlab案例,数学建模案例matlab实用程序百例
  5. SAP Open SQL
  6. 小程序 图片加载慢卡
  7. 程序员文档写作能力(三)-如何处理好微信、邮件、开会时的话术
  8. quick cocos2dx 组件使用要领
  9. windows10系统精简:NTlite工具
  10. python 生成nc文件_如何python写nc文件