CodeIgniter記錄錯誤日志的方法全面總結(jié)

字號:


    本文實例講述了CodeIgniter記錄錯誤日志的方法。分享給大家供大家參考,具體如下:
    CI工作流程:
    所有的入口都從根目錄下的index.php進(jìn)入,確定應(yīng)用所在目錄后,加載 codeigniter/CodeIgniter.php 文件,該文件會順序加載以下文件執(zhí)行整個流程。
    index.php:檢測文件路徑,加載codeigniter.php文件
    codeigniter.php: 加載 Common/constants....文件。獲取文件模式、設(shè)置計時器、實例化類(錯誤類、擴(kuò)展類、鉤子類、系統(tǒng)擴(kuò)展、配置類、編碼類、路由類、過程類、輸出類、安全類、語言類、控制器)、加載請求方法、渲染輸出view。
    CodeIgniter的一個類會保存為一個php文件,類名與文件名同名,它的核心應(yīng)用類會在類名前加"CI_"。
    system/core/common.php:包含檢測php版本、文件權(quán)限、加載核心類、獲取配置參數(shù)、加載異常/錯誤類、獲取http請求狀態(tài)等公共函數(shù)
    application/config/constants.php:設(shè)置文件權(quán)限常量、應(yīng)用程序宏定義文件
    system/core/Benchmark.php:用來記錄執(zhí)行時間
    system/core/Hooks.php:檢測是否有鉤子對象調(diào)用
    system/core/Config.php:為管理配置文件提供方法,檢測application/config/config.php參數(shù)
    application/config/config.php:配置全局參數(shù)
    system/core/URI.php:解析url參數(shù)
    system/core/Router.php:檢測路由配置,解析 HTTP 請求,以確定誰來處理
    system/core/Output.php:檢查是否有緩存文件,如果存在則直接輸出內(nèi)容。
    system/core/Input.php:過濾 HTTP 請求和任何用戶提交的數(shù)據(jù)
    system/core/Long.php:初始化提示語言變量
    system/core/conctroller.php:控制輸出類
    記錄錯誤日志:
    默認(rèn)程序不記錄錯誤日志,如果有需要的話可以設(shè)置:
    1、在application/config/config.php中設(shè)置:
    $config['log_threshold'] = 1//(可設(shè)置:1/2/3/4)
    如果為0表示不輸出錯誤日志,具體可查看里面的介紹;
    2、在需要寫入錯誤的頁面調(diào)用全局函數(shù)log_message('級別','消息'),級別有三個,一是error,即php運行錯誤,二是debug,系統(tǒng)調(diào)試,CI本身在很多頁面也加了自己的系統(tǒng)debug,三是info,介紹運行中的一些消息,消息內(nèi)容自己寫;
    3、默認(rèn)情況下錯誤日志存放在application/logs/log-[time].php中,它按日期存放文件,比如:log-2011-6-26表示存入今天的日志內(nèi)容,一般情況下為了隱藏日志內(nèi)容須將這個地址挪位,可以在$config['log_path']中設(shè)置路徑,按要求最好是完整路徑信息。
    設(shè)置自己的全局變量/配置:
    有時需要定義自己的全過程變量以供在其它地方使用,如自定義的session等,在CI中這項工作也很輕松。
    1、在application/config/中創(chuàng)建自己的config文件,注意存放文件位置。比如建立一個自己的配置文件mysetting.php,內(nèi)容,
    $config['try'] = 'this is my trying';
    2、在需要調(diào)用自定義全局變量的地方使用$this->config->load('settingfile')函數(shù),比如:
    $this->config->load('mysetting');
    如果有需要也可以通過application/config/autoload.php設(shè)置為自動加載。
    3、接下來在同一頁面中使用
    $this->config->item('varname')
    函數(shù),比如:$this->config->item('try');會輸出:this is my trying;
    上面可以看出,CI中函數(shù)調(diào)用為:$this->filename的形式,也可以看出CI把整個系統(tǒng)看成一個大的類,然后通過加載、繼承等方式獲取相應(yīng)方法。
    更多自定義變量參考:http://codeigniter.org.cn/user_guide/libraries/config.html
    隱藏index.php與加載外部文件:
    其實不管是在用CI還是ZF都有同樣一個問題,就是路徑的問題。前期,我在用ZF做CMS時,我在.htaccess文件中設(shè)置了如遇到j(luò)s,css,img等資源文件都不重定向。但今天在用CI時,卻忘記了,弄了半天都沒搞好,登陸CI的中國官方網(wǎng),終于在論壇高手的幫助下把問題觖決了,在這里把它貼出來,供大家分享。
    首先,隱藏url中的index.php文件,這樣訪問其它目錄的時候就不會有http://www.xxx.com/index.php/xxx的樣式出現(xiàn),面是直接http://www.xxx.com/xxx形式,在根目錄.htaccess文件里設(shè)置(作用是隱藏index.php,有時index.php可能不在根目錄,則htaccess須移到index.php所在目錄),如下:
    RewriteEngine on
    RewriteCond $1 !^(index\.php|images|js|css|robots\.txt)
    #這里排除了images、js、css目錄及index.php、robots.txt文件
    RewriteRule ^(.*)$ index.php/$1 [L]
    這里JS,CSS,IMG等資源文件夾與SYSTEM文件夾放在同一級下,獨立放置的好處是不用受htaccess的限制,因為htaccess文件寫明Deny from all,即拒絕訪問。打開application/config/config.php改寫配置:
    $config['base_url'] = "http://127.0.0.1/";
    $config['index_page'] = "index.php";
    如果
    $config['base_url'] = <a ,則在model_rewrite最后一行應(yīng)寫RewriteRule ^(.*)$ /index.php/$1 [L],在index.php前加一個'/'。然后在JS文件夾中建立ajax.js文件,我在VIEW層中的文件為index.html。這樣我要引入JS時,可以用CI自帶的BASE_URL來設(shè)置,如下:
    在controllers里相關(guān)控制網(wǎng)頁里添加(在其它load之前):
    $this->load->helper('url');
    在views表現(xiàn)的index.html里:
    復(fù)制代碼 代碼如下:
    <script type="text/javascript" src="http://sumsung753.blog.163.com/blog/<?=base_url().'js/ajax.js'?>"></script>
    注:這里url是網(wǎng)站相對URL(好處是可以更改根目錄后相對地址不用改變)
    這里js文件夾沒有重定向,所以可以正常訪問,而如果是受限制的頁面則比較麻煩了。
    好了,CI中引入外部的JS與CSS就這么簡單。
    注別的說明:“ RewriteCond $1 !^(index\.php|images|js|css|robots\.txt) ”這里代碼的意思是:任意你想訪問的資源都不被重定向時,都可寫在這里。有時,網(wǎng)站沒有加載CSS,JS(它的路徑都是正確的)時,都是被重定向了,這要注意。
    具體可查看CI的中國官論壇 http://codeigniter.org.cn/user_guide/helpers/url_helper.html,URL輔助函數(shù)一節(jié),
    http://codeigniter.org.cn/user_guide/general/urls.html,url設(shè)置,
    http://codeigniter.org.cn/forums/thread-4-1-2.html,Hex關(guān)于隱藏index.php的說明,但他在model_rewrite用了index\\.php,我覺得用雙反斜杠有誤。
    (另外:特別謝謝CI中國官論壇上的Hex 與visvoy )
    數(shù)據(jù)間的傳輸:
    1、將數(shù)據(jù)從控制器傳入視圖
    由于控制器controllers在ci中扮演交通警察的角色,其是一個大類,而視圖view作為controller類中的一個函數(shù)中的函數(shù),所以view可以使用controller中的屬性。所以可以這樣寫:
    Controller類Test
    class Test extends CI_Controller {
     public static $test2=''; //定義一個屬性
     public function __construct(){
     parent::__construct();
     self::$test2 = $this->load->view('new','',true); //給$test2這個屬性賦值
     }
     public function index() {
     $this->load->helper('url');
     $this->load->view('anchor');
     }
    }
    View.php
    <?php
    echo Test::$test2; //直接使用類中的值
    ?>
    這種直接使用controllers類中的值的方法雖然可行,卻不是ci所提倡的。一般來說在controller中使用$this->load->view()的時候可以通過參數(shù)傳值給view視圖:
    function index()
    {
     $data['css'] = $this->css;
     $data['base'] = $this->base;
     $data['mytitle'] = 'Welcome to this site';
     $data['mytext'] = "Hello, $name, now we're getting dynamic!";
     $this->load->view('testview', $data); //$data通過參數(shù)傳遞到view
    }
    這里,把需要傳遞的數(shù)值加入至$data數(shù)組,ci在核心類中給自動使用extract()函數(shù)把數(shù)組“解壓”出來,成為一個個變量。所以在view中可以直接這樣使用變量:
    echo $css;
    2、模型與視圖的交互
    在ci中模型總是用以處理數(shù)據(jù),模型中數(shù)據(jù)處理也是通過controller中轉(zhuǎn)到view,所以最好不要試圖模型直接與視圖聯(lián)系。手冊中有這樣一個例子:
    class Blog_controller extends CI_Controller {
     function blog() {
     $this->load->model('Blog'); //載入模型
     $data['query'] = $this->Blog->get_last_ten_entries(); //使用模型中的方法,將返回值存入$data數(shù)組
     $this->load->view('blog', $data); //像上例一樣,通過參數(shù)傳給視圖view
     }
    }
    希望本文所述對大家基于CodeIgniter框架的PHP程序設(shè)計有所幫助。