用户
 找回密码
 入住 CI 中国社区
搜索
查看: 7042|回复: 11
收起左侧

[初级] CI学习 ,边学边记 - CodeIgniter.php

[复制链接]
发表于 2012-5-12 17:37:22 | 显示全部楼层 |阅读模式
本帖最后由 imwebmaster.net 于 2012-5-12 17:33 编辑

CI版本:2.1.0准备:将CodeIgniter包 重命名为ci ,并放在环境根目录下 , /ci 。引导程序文件:/ci/system/core/CodeIgniter.php
功能:咋说呢?

1.加载全局函数
PHP复制代码
require(BASEPATH.'core/Common.php')
复制代码

load_class(),get_config() ,show_404(),等全局函数位于文件/ci/system/core/Common.php 链接到 Common.php


2.加载框架常量
PHP复制代码
 
if(defined('ENVIRONMENT') AND file_exist(APPATH .'config/' . ENVIRONMENT . '/constants.php')
{
      require( APPATH . 'config/' . ENVIRONMENT . '/constants.php' );
}
else
{
      require(APPATH . ''config/constants.php);
}
 
复制代码

文件 :/ci/application/config/constants.php
连接到constants.php
3. 设置自定义处理程序
PHP复制代码
 
set_error_handler('_exception_handler');
 
if( ! is_php('5.3') )
{
@set_magic_quotes_runtime(0);
}
 
复制代码

函数 _exception_handler() , is_php() 都位于 /ci/system/core/Common.php 。详情点击
set_magic_quotes_runtime() 用来设置当前活动配置指令magic_quotes_runtime ,1 for on ,0 for off.

启用magic_quotes_runtime 参数时,所有来着外部资源(如数据库或文本文件)的数据中的引号都会自动转义。这个特性长期一来总会导致混乱,PHP5.3.0已将其移除,所以用is_php('5.3')来侦测版本,就是这个原因啦,对吧?

PHP 基础

魔法引号
除了magic_quotes_runtime 指令外,还有两个魔法引号相关的指令:
magic_quotes_gpc:是否对GET,POST,COOKIE 传入的数据启用魔法引号,启用时所有的单引号,双引号,反斜线和空字符都是用反斜线自动转义
magic_quotes_sybase :启用时来自外部资源数据将使用单引号转义。magic_quotes_runtime 开启时才有效。
开?
启用魔法引号减少SQL注入的可能性(当然还是有可能),减少了一定的系统风险。当向数据库中插入数据时,魔术引号所做的就是自动对所有的 GET、POST、COOKIE 数据运用 addslashes() 函数。
还是关?
对于所有进入PHP的都被转义的话,肯定会影响到PHP的性能,只在运行时调用转义函数addslashes() 更有效率。

关了吧,请注意magic_quotes_gpc, 作用域:PHP_INI_SYSTEM ,所以只能在系统级关闭哦,运行时不能关。

@ 错误控制运算符
当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。

4.设置子类前缀
PHP复制代码
 
if( isset($assign_to_config['subclass_prefix']  and $assign_to_config['subclass_prefix'] != '' )
{
  get_config(array('subclass_prefix' =>$assign_to_config['subclass_prefix'] ));
}
 
复制代码


如果你不懂子类是个啥意思 ,请参见  /ci/user_guide/general/creating_libraries.html    EXTEND NATIVE LIBRARIES
你还记得 $assign_to_config  在哪来着不?

5.设置脚本最大执行时间

PHP复制代码
 
if (function_exists('set_time_limit') == TRUE  AND @ini_get('safe_mode') == 0 )
{
   @set_time_limit(300);
}
 
复制代码


PHP基础
set_time_limit(300) 函数 用来设置当前脚本本身的最大执行时间,该时间并不包括流操作,执行系统命令,数据库查询等的时间,单位为秒。另外,该函数在安全模式下无效,这也是为什么要判断safe_mode了。
另外有一点不明白,set_time_limit 在PHP4,5 中都是存在的,而CI 2.1.0 需求在>= PHP5.1.6,为什么要判断函数是否存在呢?谁知道赶紧告诉我啊。谢谢

6.开启计时器
PHP复制代码
 
$BM =& load_class('Beachmark','core');
$BM->mark('总执行时间');
$BM->mark('加载时间:基类_开始');
 
复制代码

从/ci/system/core加载Beachmark类,实例化并返回实例引用,load_class() 这个很重要哦
$BM->mark() 用来设置计时点。
如果不懂,请参见手册 :
/ci/user_guide/general/profiling.html   性能分析
ci/user_guide/libraries/benchmark.html 基准测试

扩展:
我好想记得PEAR 有一个Beachmark包,用与性能测试。

7.加载Hook类
PHP复制代码
$EXT =& load_class('Hook','core');
 
复制代码


HOOK 提供在不修改框架内核文件的情况下,修改框架的内部工作 。啥意思啊?查看一下CI的流程图/ci/user_guide/overview/appflow.html 。如果你想在执行流程的某处执行一段特殊脚本,那么就可以利用HOOK的特性。
CI 提供了7‘处’这样的地方 即 HOOK POINT ,参见手册ci/user_guide/general/hooks.html , 按照手册自己做个实验哦就明白了。
如何使用HOOK ,暂时还没有太多的概念,继续努力咯 {:soso_e101:}

8.Hook point =>  pre_system
PHP复制代码
 
$EXT-> _call_hook('pre_system')
 
复制代码



9.实例化Config类
PHP复制代码
$CFG =& load_class('Config' ,'core') ;
 
if(isset($assign_to_config) )
{
  $CFG->_assign_to_config($assign_to_cofing) ;
}
 
复制代码


10. 实例化UTF-8类
PHP复制代码
 
$UNI =& load_class('Utf8', 'core');
 
复制代码


11. 实例化Uri类
PHP复制代码
 
$URI =& load_class('URI' ,'core');
 
复制代码

解析URL,并确定路由选择

12.实例化 Router类
PHP复制代码
 
$RTR =& load_class('Router', 'core');
$RTR->_set_rounting();
if (isset($routing))
{
     $RTR->_set_overrides($routing);
}
 
复制代码


设置路由选项

13.实例化Output类
PHP复制代码
 
    $OUT =& load_class('Output', 'core')
 
复制代码


14.查找是否存在缓存文件,如果有输出缓存文件并推出
PHP复制代码
 
if($EXT->call_hook('cache_override') === FALSE)
{
   if($OUT->_display_cache($CFG, $URL) == TRUE)
   {
          exit;
   }
}
 
复制代码


15.加载Security类提供 xss ,csrf 支持
PHP复制代码
 
        $SEC =& load_class('Security', 'core');
 
复制代码


16.加载Input 类,净化全局变量
PHP复制代码
 
$IN        =& load_class('Input', 'core');
 
复制代码


17.加载Lang类
PHP复制代码
 
$LANG =& load_class('Lang', 'core');
 
复制代码


18.加载AppController 和 Local Controller
PHP复制代码
 
require BASEPATH.'core/Controller.php';
function &get_instance()
{
 return CI_Controller::get_instance();
}
 
if(file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php') )
{
   require  APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php' ;
}
 
        if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php'))
        {
                show_error('无法加载你的默认控制器. 请确定你已经在Routes.php设置了默认控制器? .');
        }
 
 
        include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php');
 
               $BM->mark('加载时间: 基类_结束'); //还记得那个 基类_ 开始 在哪设的吗 ?
 
复制代码


19. 安全检查
PHP复制代码
 
 
复制代码


20. Hook point ->pre_controller
PHP复制代码
$EXT->_call_hook('pre_controller');
复制代码


21.实例化请求控制器
PHP复制代码
 
        $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start');
        $CI = new $class();
 
 
复制代码


22.Hook point ->post_controller_constructor
PHP复制代码
$EXT->_call_hook('post_controller_constructor');
复制代码


23.调用请求控制器方法method
PHP复制代码
[/code] [b][color=#ff0000]
[/color][/b]
[b][color=#2e8b57]24.Hook point-> post_controller
[code=PHP]$EXT->_call_hook('post_controller');
复制代码


25.发送最终输出至浏览器
PHP复制代码
 
        if ($EXT->_call_hook('display_override') === FALSE)
        {
                $OUT->_display();
        }
 
 
复制代码


26.Hook point-> post_system
PHP复制代码
 
$EXT->_call_hook('post_system');
 
复制代码


27.关闭DB连接
PHP复制代码
 
        if (class_exists('CI_DB') AND isset($CI->db))
        {
                $CI->db->close();
        }
 
复制代码



评分

参与人数 1威望 +5 收起 理由
Hex + 5 赞一个!

查看全部评分

 楼主| 发表于 2012-5-12 17:40:48 | 显示全部楼层
明天继续学,继续发 ,发教程 也是一个学习的过程 ,不过是在是太累
发表于 2012-5-16 13:31:27 | 显示全部楼层
支持下,
发表于 2012-5-16 13:46:56 | 显示全部楼层
我曾经也这么做过,很辛苦也很有收获……

评分

参与人数 1威望 +6 收起 理由
justdoit + 6

查看全部评分

发表于 2012-5-16 15:21:14 | 显示全部楼层
顶一个!
发表于 2012-10-9 15:50:43 | 显示全部楼层
很好,学习了!
发表于 2012-10-29 17:15:38 | 显示全部楼层
半年过去了,不知楼主学的怎么样了。
发表于 2012-10-30 10:22:28 | 显示全部楼层
同问
发表于 2012-11-16 08:25:12 | 显示全部楼层
好贴啊
发表于 2013-1-15 16:59:52 | 显示全部楼层

同问

本版积分规则