dedecms代码研究(2)从index开始
现在继续,今天讲的主要是dedecms的入口代码。
先打开index.PHP看看里面是什么吧。打开根目录下的index.php嗯
映入眼帘的是一个if语句。检查/data/common.inc.php是否存在。如果不存在就跳转到安装界面。
if(!file_exists(dirname(__FILE__).'/data/common.inc.php'))
{
header('Location:install/index.php');
exit();
}
我们来到/data/看看这个目录和common.inc.php。
打开/data/,里面很多目录和文件,有上传的临时目录,模板缓存,压缩的临时目录,各种数据库里保存的系统配置信息的缓存文件以及其他的一些东西,就一个字乱~
好吧,我们打开common.inc.php。哦,原来就是保存了数据库连接的相关变量而已。说白了,就是dedecms的数据库连接配置文件,估计是安装完系统生成的。所以/index.php会检查它是否存在。
我们回到/index.php中继续往下看,第二个if语句,判断GET请求“upcache”是否存在,存在就更新首页缓存,不存在就直接301跳转到index.html,也就是dedecms的静态首页(记住,dedecms的前台页面都是系统生成的静态页面)。
想想接下来我们要研究什么?对,就是GET请求“upcache”存在的时候,更新首页缓存这小段代码啦。代码如下:
if(isset($_GET['upcache']) || !file_exists('index.html'))
{
require_once (dirname(__FILE__) . "/include/common.inc.php");
require_once DEDEINC."/arc.partview.class.php";
$GLOBALS['_arclistEnv'] = 'index';
$row = $dsql->GetOne("Select * From `#@__homepageset`");
$row['templet'] = MfTemplet($row['templet']);
$pv = new PartView();
$pv->SetTemplet($cfg_basedir . $cfg_templets_dir . "/" . $row['templet']);
$row['showmod'] = isset($row['showmod'])? $row['showmod'] : 0;
if ($row['showmod'] == 1)
{
$pv->SaveToHtml(dirname(__FILE__).'/index.html');
include(dirname(__FILE__).'/index.html');
exit();
} else {
$pv->Display();
exit();
}
}
else
{
header('HTTP/1.1 301 Moved Permanently');
header('Location:index.html');
}
①加载/include/common.inc.php,估计是一些常用函数和加载其他系统函数和类的文件。
②接下来又加载了DEDEINC."/arc.partview.class.php",注意DEDEINC这个常量,我们知道经过前期对dedecms目录结构观察,arc.partview.class.php是在/include目录下的,而加载/include/common.inc.php却没有用DEDEINC这个常量,这说明,common.inc.php里面定义了DEDEINC这个常量,所以后面得以使用,也印证了common.inc.php大体作用就是系统运行基本部分,都在这里面啦。我们不急着进common.inc.php,继续把index.php的更新缓存代码看完。
第三句,设置了一个全局变量:$GLOBALS['_arclistEnv'] = 'index';
第四行,获取一个表'#@__homepageset'的所有记录,当然如果你看下数据库,里面没有“#@__homepageset”这个表,我们判断,是数据库操作相关函数把表名用表名前缀替换了一下前半部分,这个都不重要了,重要的是,通过这句,获取了首页的相关配置信息,我们打开数据库里面的dede_homepageset表,晕,就一条记录,俩字段,基本猜到了,一个是首页模板名称,一个是生成的静态文件的位置。
aaarticlea/png;base64,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" alt="" />
回来继续分析前面的代码
$row['templet'] = MfTemplet($row['templet']);
通过MfTemplet函数好像把$row['templet']进行了某些转换。我们记下MfTemplet函数,以待后面挖掘。
接下来,就是new了一个PartView类,看这个名字,我们就知道了前面加载arc.partview.class.php的作用啦。
至于这个PartView类有什么作用,我们继续看代码。看了下面两行,我想大家应该都明白啦
$pv->SetTemplet($cfg_basedir . $cfg_templets_dir . "/" . $row['templet']);
$pv->SaveToHtml(dirname(__FILE__).'/index.html');
创建个视图对象(PartView类的实例,我们姑且叫视图对象),设置模板,通过SaveToHtml方法,把最后生成的页面写到指定位置。
首页生成完毕,接下来就是把生成的静态文件通过include的形式显示出来,然后exit中断页面解析。
至此,/index.php就分析完啦。
它先是通过/data/common.inc.php,判断是否安装了dedecms或者说判断是否定义了数据库配置信息,好为后面操作打下基础。 然后判断是否有GET请求"upcache",如果有就加载/include/common.inc.php初始化系统,然后调用partview类的相关方法来生成静态首页文件,最后显示出来。 这么来看dedecms也没有太多的秘密嘛~
不过呢,我们这篇文章也遗留下了几个问题:
1)加载了/include/common.inc.php,里面做了哪些工作?
2)/include/arc.partview.class.php到底是干什么的,/include/下还有很多arc开头的文件都是干什么的?
3)MfTemplet这个函数到底对模板文件路径这个字符串做了什么操作?
4)partview类的相关方法都有什么秘密?
带着这几个疑问,我们将结束本文,后面的文章将将这些谜题一一揭开。 博主个人博客:www.kanronghua.com 欢迎学习交流。