先来看一个实际的例子,项目中存在这样一个配置文件:
PHP复制代码 $STATUS='normal';//测试为test,正式为normal $KEY_INFO=array( 'a_test'=>array( 'key'=>'a_test_key', 'value'=>'a_test_value' ), 'a_normal'=>array( 'key'=>'a_normal_key', 'value'=>'a_normal_value' ), 'b_test'=>array( 'key'=>'b_test_key', 'value'=>'b_test_value' ), 'b_normal'=>array( 'key'=>'b_normal_key', 'value'=>'b_normal_value' ), ); 复制代码 生产环境和测试环境的开关通过$STATUS变量来控制,而$STATUS定义和配置文件在同一个文件中,这意味着每次发布的时候都需要把这个值改成normal,测试的时候在调整回来,这样就无缘无故增加了发布的难度和错误产生的几率,每次提交的时候都得小心翼翼。产生该问题的主要原因就是把环境和配置没有分离开,环境和配置耦合在一个文件里了。很多时候我们写一个类的时候也会有类似的做法,将类需要配置的信息直接写死在属性中,不方便调整。 所以多环境的配置是十分有必要的,而Codeigniter框架是支持多环境配置的,环境的配置在index.php入口文件的第21行
PHP复制代码 /*
*---------------------------------------------------------------
* APPLICATION ENVIRONMENT
*---------------------------------------------------------------
*
* You can load different configurations depending on your
* current environment. Setting the environment also influences
* things like logging and error reporting.
*
* This can be set to anything, but default usage is:
*
* development
* testing
* production
*
* NOTE: If you change these, also change the error_reporting() code below
*
*/ define('ENVIRONMENT','development'); 复制代码 即CI开篇就定义了环境配置,那不同的环境配置会影响到哪些方面?1、 报错机制。不同的环境设置的报错级别不同,如开发环境(development)会显示所有错误信息,而生成环境(production)则会屏蔽所有错误信息。2、 加载的配置文件不同,从而实现多套环境配置。在开发过程中会将数据库配置设置为测试服或本机,而生成环境下会修改为正式服。那这么多环境该如何设置?先看看application目录下的config目录,该目录主要为系统的配置目录,如数据库配置、路由配置等。以数据库配置为例,当连接DB时,会读取config/database.php的配置文件,但这种情况是在没有自定义配置时。当我们定义ENVIRONMENT为development是,并创建config/development/database.php时,系统会从此环境来读取数据库配置,而非config/database.php所以针对开发环境我们可以创建development目录,并将开发的配置文件放置于此目录下,创建production目录,用于发布时生产环境的配置,如下图所示:
注意:
对于个人定义的配置文件,若通过$this->load->config的方式加载,也适用多套环境,若是通过include加载则不行。环境配置完之后还需要配合SVN的管理,方便日常的工作。那针对多种环境SVN要如何配置?创建项目的时候,在config下创建development目录和production目录,并将两个目录提交到SVN,然后忽略两个目录里面的所有文件。那么其他人down下来的时候,会存在这两个目录,但目录是空的,若个人有特殊配置,拷贝相应的配置文件到ENVIRONMENT目录下即可,既可自定义,又无需担心提交到SVN。至于怎么忽略文件夹里面的内容,可参考如下方式:
在development目录下随意创建个 a.txt 和 a 目录,选择两个文件,右键SVN选项中按扩展名忽略,并提交到SVN即可。SVN应尽可能的保持干净,以免因疏忽而导致提交异常代码到SVN,从而影响到其他人的开发效率和生产环境的正常功能。