Bacysoft.cn
标题:
新安装的 Discuz!X 是如何判断是否是第一次安装并自动跳转到 Install 页面的呢?
[打印本页]
作者:
bacy001
时间:
2012-7-5 16:51
标题:
新安装的 Discuz!X 是如何判断是否是第一次安装并自动跳转到 Install 页面的呢?
通过分析 Discuz 的源码可以找到答案。
首先在 Discuz! X2 根目录下找到 index.php。正常情况下首先加载的均是此文件。此文件的主要功能是根据客户端传送过来的URL来判断应该跳转到的目标页面。
例如,假设用户输入的网址是:
http://www.bacysoft.cn/?2
,那么 index.php 就能通过如下代码自动跳转到“UID=2”的用户的个人空间。
if(!empty($_SERVER['QUERY_STRING']) && is_numeric($_SERVER['QUERY_STRING'])) { //如果查询字串非空且是数字
$_ENV['curapp'] = 'home'; //则设置当前应用为家园并设置相关变量指定将要跳转到的用户空间
$_GET = array('mod'=>'space', 'uid'=>$_SERVER['QUERY_STRING']);
}
复制代码
如果没有跟任何参数,且是第一次安装 index.php 运行完最后的结果就是跳转到 portal.php 继续处理。跳转代码如下:
header("HTTP/1.1 301 Moved Permanently"); //这里跳转到对应的模块的入口
header("location: $url");
复制代码
其中 $url 的值便是“portal.php”。
当页面跳转到 portal.php 以后,将加载 Discuz! X2 核心类,并创建一个核心类的实例!代码如下:
require './source/class/class_core.php';
$discuz = & discuz_core::instance();
复制代码
核心类初始化的时候需要判断是否是第一次安装,如果是就跳转到安装页面执行安装程序。下面我们找到并打开定义了核心类的文件:“./source/class/class_core.php”。找到核心类的构造函数,代码如下:
function discuz_core() {
$this->_init_env();
$this->_init_config();
$this->_init_input();
$this->_init_output();
}
复制代码
我们看到构造函数主要做了四件事情:初始化环境、初始化配置、初始化输入、初始化输出。依次查看这四个模块,终于在“_init_config()”中找到了“install”的身影。代码如下:
function _init_config() {
$_config = array();
@include DISCUZ_ROOT.'./config/config_global.php';
if(empty($_config)) {
if(!file_exists(DISCUZ_ROOT.'./data/install.lock')) {
header('location: install');
exit;
} else {
system_error('config_notfound');
}
}
复制代码
这段代码位于“function _init_config()”起始的部分,可以看到,代码首先定义了变量“$_config”,然后加载配置文件“./config/config_global.php”,如果是第一次安装,这个配置文件是不存在的。这样变量“$_config”依旧是空值,于是判断“./data/install.lock”文件是否存在,如果也不存在就确定是第一次安装,然后马上通过命令“header('location: install')”跳转到安装页面。
本次分析到处结束,以上分析基于 Discuz! X2 Release 20120329
欢迎光临 Bacysoft.cn (http://bacysoft.cn/)
Powered by Discuz! X3.3