隐藏

【ci框架】codeigniter中如何记录错误日志

发布:2016/12/22 22:24:52作者:管理员 来源:本站 浏览次数:1487

  1. CI工作流程:  
  2.         所有的入口都从根目录下的index.php进入,确定应用所在目录后,加载 codeigniter/CodeIgniter.php 文件,该文件会顺序加载以下文件执行整个流程。  
  3.   
  4.      index.php:检测文件路径,加载codeigniter.php文件  
  5.   
  6.     codeigniter.php: 加载 Common/constants....文件。获取文件模式、设置计时器、实例化类(错误类、扩展类、钩子类、系统扩展、配置类、编码类、路由类、过程类、输出类、安全类、语言类、控制器)、加载请求方法、渲染输出view。  
  7.       
  8.     CodeIgniter的一个类会保存为一个php文件,类名与文件名同名,它的核心应用类会在类名前加"CI_"。  
  9.   
  10.     system/core/common.php:包含检测php版本、文件权限、加载核心类、获取配置参数、加载异常/错误类、获取http请求状态等公共函数  
  11.   
  12.     application/config/constants.php:设置文件权限常量、应用程序宏定义文件  
  13.   
  14.     system/core/Benchmark.php:用来记录执行时间  
  15.   
  16.     system/core/Hooks.php:检测是否有钩子对象调用  
  17.   
  18.     system/core/Config.php:为管理配置文件提供方法,检测application/config/config.php参数  
  19.   
  20. application/config/config.php:配置全局参数  
  21.   
  22.     system/core/URI.php:解析url参数  
  23.   
  24.     system/core/Router.php:检测路由配置,解析 HTTP 请求,以确定谁来处理  
  25.   
  26.     system/core/Output.php:检查是否有缓存文件,如果存在则直接输出内容。  
  27.   
  28.     system/core/Input.php:过滤 HTTP 请求和任何用户提交的数据  
  29.   
  30.     system/core/Long.php:初始化提示语言变量  
  31.   
  32.    system/core/conctroller.php:控制输出类  
  33.   
  34. 引用自:百度空间  
  35.   
  36. 记录错误日志:  
  37.   
  38. 默认程序不记录错误日志,如果有需要的话可以设置:  
  39.   
  40. 1、在application/config/config.php中设置$config['log_threshold'] = 1/2/3/4,如果为0表示不输出错误日志,具体可查看里面的介绍;  
  41.   
  42. 2、在需要写入错误的页面调用全局函数log_message('级别','消息'),级别有三个,一是error,即php运行错误,二是debug,系统调试,CI本身在很多页面也加了自己的系统debug,三是info,介绍运行中的一些消息,消息内容自己写;  
  43.   
  44. 3、默认情况下错误日志存放在application/logs/log-[time].php中,它按日期存放文件,比如:log-2011-6-26表示存入今天的日志内容,一般情况下为了隐藏日志内容须将这个地址挪位,可以在$config['log_path']中设置路径,按要求最好是完整路径信息。  
  45.   
  46. 设置自己的全局变量/配置:  
  47.   
  48. 有时需要定义自己的全过程变量以供在其它地方使用,如自定义的session等,在CI中这项工作也很轻松。  
  49. 1、在application/config/中创建自己的config文件,注意存放文件位置。比如建立一个自己的配置文件mysetting.php,内容,$config['try'] = 'this is my trying';  
  50.   
  51. 2、在需要调用自定义全局变量的地方使用$this->config->load('settingfile')函数,比如:  
  52. $this->config->load('mysetting');  
  53. 如果有需要也可以通过application/config/autoload.php设置为自动加载。  
  54.   
  55. 3、接下来在同一页面中使用$this->config->item('varname')函数,比如:$this->config->item('try');会输出:this is my trying;  
  56. 上面可以看出,CI中函数调用为:$this->filename的形式,也可以看出CI把整个系统看成一个大的类,然后通过加载、继承等方式获取相应方法。  
  57. 更多自定义变量参考:http://codeigniter.org.cn/user_guide/libraries/config.html  
  58.   
  59. 隐藏index.php与加载外部文件:  
  60. 来自:百度空间,有更改。  
  61.     
  62.      其实不管是在用CI还是ZF都有同样一个问题,就是路径的问题。前期,我在用ZF做CMS时,我在.htaccess文件中设置了如遇到js,css,img等资源文件都不重定向。但今天在用CI时,却忘记了,弄了半天都没搞好,登陆CI的中国官方网,终于在论坛高手的帮助下把问题觖决了,在这里把它贴出来,供大家分享。  
  63.   
  64.    首先,隐藏url中的index.php文件,这样访问其它目录的时候就不会有http://www.xxx.com/index.php/xxx的样式出现,面是直接http://www.xxx.com/xxx形式,在根目录.htaccess文件里设置(作用是隐藏index.php,有时index.php可能不在根目录,则htaccess须移到index.php所在目录),如下:  
  65.   
  66.      RewriteEngine on      
  67.      RewriteCond $1 !^(index\.php|images|js|css|robots\.txt)    #这里排除了images、js、css目录及index.php、robots.txt文件  
  68.      RewriteRule ^(.*)$ index.php/$1 [L]  
  69.   
  70.     这里JS,CSS,IMG等资源文件夹与SYSTEM文件夹放在同一级下,独立放置的好处是不用受htaccess的限制,因为htaccess文件写明Deny from all,即拒绝访问。打开application/config/config.php改写配置:  
  71.   
  72.      $config['base_url'] = "http://127.0.0.1/";  
  73.      $config['index_page'] = "index.php";  
  74.   
  75.     如果, $config['base_url'] = "http://127.0.0.1";后面没加'/',则在model_rewrite最后一行应写RewriteRule ^(.*)$ /index.php/$1 [L],在index.php前加一个'/'。然后在JS文件夹中建立ajax.js文件,我在VIEW层中的文件为index.html。这样我要引入JS时,可以用CI自带的BASE_URL来设置,如下:  
  76.   
  77.     在controllers里相关控制网页里添加(在其它load之前):  
  78.   
  79.       $this->load->helper('url');  
  80.   
  81.     在views表现的index.html里:  
  82.   
  83.      <script type="text/javascript" src="http://sumsung753.blog.163.com/blog/<?=base_url().'js/ajax.js'?>"></script>    注:这里url是网站相对URL(好处是可以更改根目录后相对地址不用改变)  
  84.   
  85.    这里js文件夹没有重定向,所以可以正常访问,而如果是受限制的页面则比较麻烦了。  
  86.   
  87. 好了,CI中引入外部的JS与CSS就这么简单。  
  88.   
  89. 注别的说明:“ RewriteCond $1 !^(index\.php|images|js|css|robots\.txt) ”这里代码的意思是:任意你想访问的资源都不被重定向时,都可写在这里。有时,网站没有加载CSS,JS(它的路径都是正确的)时,都是被重定向了,这要注意。  
  90.   
  91. 具体可查看CI的中国官论坛 http://codeigniter.org.cn/user_guide/helpers/url_helper.html,URL辅助函数一节,  
  92. http://codeigniter.org.cn/user_guide/general/urls.html,url设置,  
  93. http://codeigniter.org.cn/forums/thread-4-1-2.html,Hex关于隐藏index.php的说明,但他在model_rewrite用了index\\.php,我觉得用双反斜杠有误。  
  94.   
  95.     (另外:特别谢谢CI中国官论坛上的Hex 与visvoy )  
  96.   
  97. 数据间的传输:  
  98. 1、将数据从控制器传入视图  
  99.      由于控制器controllers在ci中扮演交通警察的角色,其是一个大类,而视图view作为controller类中的一个函数中的函数,所以view可以使用controller中的属性。所以可以这样写:  
  100. Controller类Test  
  101. class Test extends CI_Controller {  
  102.     public static $test2=''//定义一个属性  
  103.     public function __construct(){  
  104.         parent::__construct();  
  105.         self::$test2 = $this->load->view('new','',true); //给$test2这个属性赋值  
  106.     }  
  107.     public function index()    {      
  108.         $this->load->helper('url');              
  109.         $this->load->view('anchor');      
  110.     }  
  111. }  
  112. View.php  
  113. <?php  
  114. echo Test::$test2//直接使用类中的值  
  115. ?>  
  116. 这种直接使用controllers类中的值的方法虽然可行,却不是ci所提倡的。一般来说在controller中使用$this->load->view()的时候可以通过参数传值给view视图:  
  117. function index()  
  118. {  
  119.     $data['css'] = $this->css;  
  120.     $data['base'] = $this->base;  
  121.     $data['mytitle'] = 'Welcome to this site';  
  122.     $data['mytext'] = "Hello, $name, now we're getting dynamic!";  
  123.     $this->load->view('testview'$data); //$data通过参数传递到view  
  124. }  
  125. 这里,把需要传递的数值加入至$data数组,ci在核心类中给自动使用extract()函数把数组“解压”出来,成为一个个变量。所以在view中可以直接这样使用变量:  
  126. echo $css;  
  127.   
  128. 2、模型与视图的交互  
  129. 在ci中模型总是用以处理数据,模型中数据处理也是通过controller中转到view,所以最好不要试图模型直接与视图联系。手册中有这样一个例子:  
  130. class Blog_controller extends CI_Controller {  
  131.     function blog()    {  
  132.         $this->load->model('Blog'); //载入模型  
  133.         $data['query'] = $this->Blog->get_last_ten_entries(); //使用模型中的方法,将返回值存入$data数组  
  134.         $this->load->view('blog'$data); //像上例一样,通过参数传给视图view  
  135.     }