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”的用户的个人空间。
  1. if(!empty($_SERVER['QUERY_STRING']) && is_numeric($_SERVER['QUERY_STRING'])) {        //如果查询字串非空且是数字
  2.         $_ENV['curapp'] = 'home';        //则设置当前应用为家园并设置相关变量指定将要跳转到的用户空间
  3.         $_GET = array('mod'=>'space', 'uid'=>$_SERVER['QUERY_STRING']);       
  4. }
复制代码
如果没有跟任何参数,且是第一次安装 index.php 运行完最后的结果就是跳转到 portal.php 继续处理。跳转代码如下:
  1.         header("HTTP/1.1 301 Moved Permanently");        //这里跳转到对应的模块的入口
  2.         header("location: $url");
复制代码
其中 $url 的值便是“portal.php”。

当页面跳转到 portal.php 以后,将加载 Discuz! X2 核心类,并创建一个核心类的实例!代码如下:
  1. require './source/class/class_core.php';
  2. $discuz = & discuz_core::instance();
复制代码
核心类初始化的时候需要判断是否是第一次安装,如果是就跳转到安装页面执行安装程序。下面我们找到并打开定义了核心类的文件:“./source/class/class_core.php”。找到核心类的构造函数,代码如下:
  1.         function discuz_core() {
  2.                 $this->_init_env();
  3.                 $this->_init_config();
  4.                 $this->_init_input();
  5.                 $this->_init_output();
  6.         }
复制代码
我们看到构造函数主要做了四件事情:初始化环境、初始化配置、初始化输入、初始化输出。依次查看这四个模块,终于在“_init_config()”中找到了“install”的身影。代码如下:
  1.         function _init_config() {

  2.                 $_config = array();
  3.                 @include DISCUZ_ROOT.'./config/config_global.php';
  4.                 if(empty($_config)) {
  5.                         if(!file_exists(DISCUZ_ROOT.'./data/install.lock')) {
  6.                                 header('location: install');
  7.                                 exit;
  8.                         } else {
  9.                                 system_error('config_notfound');
  10.                         }
  11.                 }
复制代码
这段代码位于“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