CodeIgniter框架源码笔记(2)——请求的接收者:框架入口index.php

来源:互联网 发布:复杂网络同步 编辑:程序博客网 时间:2024/05/21 10:36

作为框架的入口文件,CI并没把整个框架生命周期的生成和调度放到index.php,仅仅让它做了一个环境设置和常量初始化的工作(重点是跟文件路径相关的几个常量)。

一、设置常量ENVIRONMENT,这个常量决定了报错级别、配置Config加载。

define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
其中$_SERVER['CI_ENV'] 的值可以在 .htaccess 文件或 Apache 的配置文件中 使用 SetEnv 命令进行设置,Nginx 或其他 Web 服务器也有类似的设置方法。 或者你可以直接删掉这个逻辑,根据服务器的 IP 地址来设置该常量

二、决定错误报告等级,是根据ENVIRONMENT来决定的了。

接收ENVIRONMENT值为development(开发)、testing(测试)production(生产)的三种设置。

switch (ENVIRONMENT){case 'development':error_reporting(-1);ini_set('display_errors', 1);break;case 'testing':case 'production':ini_set('display_errors', 0);if (version_compare(PHP_VERSION, '5.3', '>=')){error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED);}else{error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE);}break;default:header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);echo 'The application environment is not set correctly.';exit(1); // EXIT_ERROR}

三、设置系统目录 $system_path = 'system';
这个值可以改成任意,可以是绝对路径,也可是相对路径,只要对应的系统目录能找到,可以设置$system_path = 'system';也可以$system_path = '/data/mingshucore/'。为什么这么拽?因为在文件的后面会将它统统转换成绝对路径
if (($_temp = realpath($system_path)) !== FALSE){      $system_path = $_temp.'/';}else{       // Ensure there's a trailing slash       $system_path = rtrim($system_path, '/').'/';}
另外$system_path并不是最终被使用的变量,它经过转换后最终生成常量BASEPATH,有码为证:define('BASEPATH', str_replace('\\', '/', $system_path));),


四、设置应用程序路径$application_folder = 'application';
这个值可以改成任意,可以是绝对路径,也可是相对路径。如果使用相对路径的话,那就是基于目录状态下的,也就是当前文件index.php所在目录。不过CI这里作了一个处理,就是允许你如果用相对路径的话,可以把目录设置在核心文件夹($system_path定义的)中,且在设置是可以略去写BASEPATH,系统自动帮你补上。个人觉得这功能挺多余的,允许将用户应用程序放到系统程序中,画蛇添足。有时侯,给用户太多的选择和余地并不是件好事,那样容易导致他们犯错。 $application_folder并不是最终被使用的变量,它经过转换后最终生成常量APPPATH(绝对路径)
   if (is_dir($application_folder))    {        if (($_temp = realpath($application_folder)) !== FALSE)        {            $application_folder = $_temp;        }        define('APPPATH', $application_folder.DIRECTORY_SEPARATOR);    }    else    {        if ( ! is_dir(BASEPATH.$application_folder.DIRECTORY_SEPARATOR))        {            header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);            echo 'Your application folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF;            exit(3); // EXIT_CONFIG        }        define('APPPATH', BASEPATH.$application_folder.DIRECTORY_SEPARATOR);    }

    知识点:这里用了is_dir进行判断路径是否存在,判断文件或目录是否存在时,常用file_exists()。该函数相当于is_file()和is_dir()合体,方便程序员使用,都接受绝对路径或相对路径作为参数。
    但效率却不如is_file()和is_dir()。但并不是网传的有不有缓存的原因哦,因为两者都是有缓存的,且能立即响应文件变化做出状态的更新
    echo ("is_file(\"tem.php\"):".(is_file("tem.php"))."<br>");
    echo ("file_exists(\"tem.php\"):".(file_exists("tem.php"))."<br>");
 。is_file()和file_exists()    效率比较,结果当文件存在时,is_file函数比file_exists函数速度快14倍,当文件不存在时,两者速度相当。同理,当文件目录存在时,is_dir()比file_exists()快18倍。不存在时两者效率相当。PHP的file_exists = is_dir + is_file。
    * 如果要判断目录是否存在,请优先考虑函数 is_dir(directory)
    * 如果要判断文件是否存在,请优先考虑函数 is_file(filepath)


五、设置$view_folder。
可以设置一个存在的绝对路径。如果使用了相对路径,先基于当前文件目录查找。如果存在,就直接加固并转换成绝对路径(realpath取出的路径是没有后面的斜杠的),并且剔除尾部的斜杠,因为为了兼容win和linux,所以一般不会使用程序中硬编码的斜杠,而是使用php的内置常量DIRECTORY_SEPARATOR作为目录分隔符。如果按当前目录找不到,则先从APPPATH下找,如果找不到,就默认使用APPPATH下的views目录了。如果你不慎把views搞掉了,那就503了。
 if ( ! is_dir($view_folder))    {        if ( ! empty($view_folder) && is_dir(APPPATH.$view_folder.DIRECTORY_SEPARATOR))        {            $view_folder = APPPATH.$view_folder;        }        elseif ( ! is_dir(APPPATH.'views'.DIRECTORY_SEPARATOR))        {            header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);            echo 'Your view folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF;            exit(3); // EXIT_CONFIG        }        else        {            $view_folder = APPPATH.'views';        }    }    if (($_temp = realpath($view_folder)) !== FALSE)    {        $view_folder = $_temp.DIRECTORY_SEPARATOR;    }    else    {        $view_folder = rtrim($view_folder, '/\\').DIRECTORY_SEPARATOR;    }    define('VIEWPATH', $view_folder);


六、其它常量
当前文件名称:

define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
前端入口文件路径,也就是当前文件的路径
define('FCPATH', dirname(__FILE__).'/');
系统目录名称,也就是BASEPATH最后一个目录名称
define('SYSDIR', trim(strrchr(trim(BASEPATH, '/'), '/'), '/'));

七、被注释的变量
设置系统加载时默认的。正常设置路由应该在APP_PATHroutes.php文件中,这里提供了一个口子,让用户进行设置。
// $routing['directory'] = '';
// $routing['controller'] = '';
// $routing['function']    = '';
用户自定义配置文件,可覆盖config.php
$assign_to_config['name_of_config_item'] = 'value of config item';


八、基础常量配置完毕
默认安装(/data/www/cisite以各人机器为准 )下,最终常量值为:
APPPATH:/data/www/cisite/application/
VIEWPATH:/data/www/cisite/application/views/
BASEPATH:/data/www/cisite/system/
SELF:index.php
FCPATH:/data/www/cisite/
SYSDIR:system


九、加载真正的核心控制文件core/CodeIgniter.php
接下来看看CodeIgniter.php到底做了什么

0 0
原创粉丝点击