discuz代码解析-初始化过程
2017-06-15 14:23
549 查看
discuz是国内著名的论坛系统,今天大象有空看看源码,顺便理下流程,跟哥交流请发邮件到576272452@qq.com
一、首先必须知道的目录结构
(一)uc_client Ucentent客户端程序
(二)uc_server Ucentent服务端程序
(三)static 静态文件
(四)install 安装目录
(五)config 站点配置
(六)api 外部接口
(七)templets 模板目录
(八)source 代码主目录
(九)data 数据缓存及附件
(十) archive 论坛静态化
二、流程结构(随便找个地址来分析下,比如 设置 -> 个人资料 -> 联系方式;地址是:home.php?mod=spacecp&ac=profile&op=contact)
(一)首先打开home.php文件 看到第17行
我同时打开了多个入口的文件都有这么一个引入,因此可以肯定这是个入口配置文件,负责文件引入及初始化需要的组件,下面来看下这个文件
第10行 error_reporting(E_ALL); 报告所有错误
第12-15行四个常量定义
第17-22行设置异常处理函数
第24-30行设置类自动引入的处理函数(这里看仔细,很重要)
第32行 初始化core类
这个C是core类的映射,证据是第208行
来看静态方法creatapp()
我们看到是返回了一个属性,这个属性_app 是discuz_application::instance()的返回值,我们来看discuz_application类,从上面的自动引入中我们看到这个类的地址是 ./source/class/discdz/discdz_application.php,
来看刚才执行的静态方法 discuz_application::instance() 的返回值是个啥?
原来是按址引用的,并且是实理化自身了,这个类继承自抽象类discuz_base,这个应该是个基类,来看看构造函数。
好了,现在我们明白了,我们现在得到了一个对象C,并且它有一个属性叫_app,这个属性是discuz_application对象,再在回到入口配置文件class_core.php,下面执行到了第209行,我们看到一个映射
DB代表了discuz_database对象,我们去看看这个对象。从上面的自动引入类机制中我们得到了这个类位于 ./source/class/discdz/discdz_application.php。打开看看,原来是数据库操作的;静态方法 init($driver, $config)应该是初始化这个类的方法,从字面意思看,传两个参数进来,第一个参数是数据库驱动,第二个参数是数据库连接参数,以后的数据库操作应该都是DB::update() DB::delete这样的方法了。
好了,跟着程序运行顺序走,我们现在返回到入口文件home.php第18行
进去看看,原来是一组函数,这是个函数库,瞄了两眼,现在回到home.php第20行
原来是把discuz_application对象赋值给变量$discuz。
到第22-24行
哇靠,$discuz->init();这一行才是核心中的核心,具体功能是初始化整个discuz应用。discuz_application类是整个discuz的应用初始化类,相当于织梦的 /include/common.inc.php的功能
核心代码第一句 $this->_init_db();
DB::init方法是在discuz_database类中实例化了数据库驱动类db_driver_mysql驱动类,并将其赋值给DB::db属性,根据自动引入规则驱动类的位置在:./source/class/db/db_driver_mysql.php;
核心代码第二句 $this->_init_setting(),
核心代码第三句$this->_init_user();discuz_application.php 428-493行
$auth = getglobal('auth', 'cookie') 得到cookie中的auth的值,加密过的值
$auth = daddslashes(explode("\t", authcode($auth, 'DECODE'))); 利用authcode函数解密,得到一个数组
list($discuz_pw, $discuz_uid) = empty($auth) || count($auth) < 2 ? array('', '') : $auth; 从这句看数组第一个元素为密码,第二个元素是会员登陆的ID。存在common_member表中。
$user = getuserbyuid($discuz_uid, 1);利用getuserbyuid得到会员信息,第二个参数如果是1并且在common_member中没有该会员就去common_member_archive表中去寻找,否则直接去common_member表中查找
这里作用是检查登陆了没有。
462行;!empty($this->cachelist) && loadcache($this->cachelist);装载缓存, 使用缓存可以参照我另一篇文章中关于缓存的应用
477行;$this->var['member']['lastvisit'] = TIMESTAMP - 3600;dsetcookie('lastvisit', TIMESTAMP - 3600, 86400 * 30);设置最后浏览的时间
464-490行,设置了cookie、全局变量、增加var属性变量
核心代码第四句 $this->_init_session();discuz_application.php 386-426行
设置session类,更新用户状态
核心代码第五句 $this->_init_mobile();discuz_application.php 680-789行
大概看了下,都是设置手机访问的一些变量,全局变量,cookie,session,跳转,常量等,有空细看下
核心代码第六句$this->_init_cron();discuz_application.php 508-515行
计划任务初始化 。配置文件中 $_config['remote']['cron'] = 1;设置后;远程调用: 开启外部 cron 任务. 系统内部不再执行cron, cron任务由外部程序激活
至此我们看到了一个完整的初始化过程
一、首先必须知道的目录结构
(一)uc_client Ucentent客户端程序
(二)uc_server Ucentent服务端程序
(三)static 静态文件
(四)install 安装目录
(五)config 站点配置
(六)api 外部接口
(七)templets 模板目录
(八)source 代码主目录
(九)data 数据缓存及附件
(十) archive 论坛静态化
二、流程结构(随便找个地址来分析下,比如 设置 -> 个人资料 -> 联系方式;地址是:home.php?mod=spacecp&ac=profile&op=contact)
(一)首先打开home.php文件 看到第17行
第10行 error_reporting(E_ALL); 报告所有错误
第12-15行四个常量定义
来看刚才执行的静态方法 discuz_application::instance() 的返回值是个啥?
好了,跟着程序运行顺序走,我们现在返回到入口文件home.php第18行
到第22-24行
核心代码第二句 $this->_init_setting(),
$auth = getglobal('auth', 'cookie') 得到cookie中的auth的值,加密过的值
$auth = daddslashes(explode("\t", authcode($auth, 'DECODE'))); 利用authcode函数解密,得到一个数组
list($discuz_pw, $discuz_uid) = empty($auth) || count($auth) < 2 ? array('', '') : $auth; 从这句看数组第一个元素为密码,第二个元素是会员登陆的ID。存在common_member表中。
$user = getuserbyuid($discuz_uid, 1);利用getuserbyuid得到会员信息,第二个参数如果是1并且在common_member中没有该会员就去common_member_archive表中去寻找,否则直接去common_member表中查找
462行;!empty($this->cachelist) && loadcache($this->cachelist);装载缓存, 使用缓存可以参照我另一篇文章中关于缓存的应用
477行;$this->var['member']['lastvisit'] = TIMESTAMP - 3600;dsetcookie('lastvisit', TIMESTAMP - 3600, 86400 * 30);设置最后浏览的时间
464-490行,设置了cookie、全局变量、增加var属性变量
核心代码第四句 $this->_init_session();discuz_application.php 386-426行
设置session类,更新用户状态
if($this->session->get('groupid') == 6)判断session中的groupid合法性 $this->session->set('lastactivity', TIMESTAMP);设置最后访问时间为当前时间 dsetcookie('lip', $this->var['member']['lastip'].','.$this->var['member']['lastvisit']);第一次访问的话设置访问IP的session C::t('common_member_status')->update($this->var['uid'], array('lastip' => $this->var['clientip'], 'lastvisit' => TIMESTAMP));//更新用户的状态 |
大概看了下,都是设置手机访问的一些变量,全局变量,cookie,session,跳转,常量等,有空细看下
核心代码第六句$this->_init_cron();discuz_application.php 508-515行
计划任务初始化 。配置文件中 $_config['remote']['cron'] = 1;设置后;远程调用: 开启外部 cron 任务. 系统内部不再执行cron, cron任务由外部程序激活
相关文章推荐
- 转载:discuz代码解析(一、初始化应用的过程)
- discuz代码解析(初始化应用的过程)
- discuz代码解析(一、初始化应用的过程)
- discuz代码解析(一、初始化应用的过程)
- Discuz!NT代码阅读笔记(2)--网站安装自动化--论坛程序安装及初始化过程
- Discuz!NT 代码阅读笔记(8.1)--DNT的几个分页存储过程解析
- Discuz!NT 代码阅读笔记(8)--DNT的几个分页存储过程解析
- Discuz!NT代码阅读笔记(2)--网站安装自动化--论坛程序安装及初始化过程
- Discuz!NT 代码阅读笔记(8)--DNT的几个分页存储过程解析
- Discuz!NT代码阅读笔记(2)--网站安装自动化--论坛程序安装及初始化过程 (转)
- 解析 Java 类和对象的初始化过程(由一个单态模式引出的问题谈起)
- 解析Java类和对象的初始化过程
- 解析Java中的类和对象的初始化过程
- 解析 Java 类和对象的初始化过程(转)
- 【原】discuz! 7.2 超详细代码解析(1)
- Discuz!NT代码阅读笔记(3)--网站安装也能自动化:DNT安装时使用到的几个函数解析 (转)
- Discuz!NT 代码阅读笔记(9)--DNT数据库中唯一的用户函数解析
- [转载]解析Java类和对象的初始化过程_J2EE_Java开发_软件开发-编程-IT资源网
- PhoneMe Advanced 代码浅读一----CVM启动和初始化过程
- Discuz!NT代码阅读笔记(3)--网站安装也能自动化:DNT安装时使用到的几个函数解析