一、調試模式
開啟調試模式后,可以看到更加詳細的錯誤信息,調試模式的作用的在於顯示或者記錄更多的日志信息,以便在開發過程中快速定位和解決問題
只需要在項目配置文件中添加一個'APP_DEBUG'=>true,即可開啟
1、開啟調試模式后,系統在運行時會首先檢查是否定義了項目調試配置文件,如果沒有定義則使用系統調試配置文件(這是ThinkPHP為我們定義好的),系統調試配置文件為系統目錄->Common->debug.php文件
2、在系統調試配置文件中,'DB_FIELDS_CACHE'=>false 即關閉數據表字段緩存,因為在調試模式下考慮到數據表結構會經常變動,所以默認只要開啟調試模式就關閉數據表字段緩存
所謂數據表字段緩存,就是ThinkPHP會將整個應用所涉及的表的結構都緩存到應用目錄->Runtime->Data->_files目錄中,每張表對應一個php文件,文件名就是表名,文件內容是一個記錄該表字段信息的數組!也就是說如果開啟了該緩存,那么在直接對數據庫中的表結構進行的修改是不會反映到表結構緩存文件的,而在用Model對表進行操作的時時是根據表結構緩存文件中的結構信息來的,所以會導致比如新加的一個字段插入不進去數據的問題
關於數據表結構緩存,這里有一個鏈接
3、項目調試配置文件
在應用目錄->Config目錄下新建一個debug.php文件,內容格式按照系統調試配置文件,最好是將系統調試配置文件的內容copy過來,然后再對其進行刪除、增加或修改
不管是否開啟調試模式,都會加載項目配置文件(顯然是的,不先加載項目配置文件,怎么知道是否開啟了調試模式呢?對吧),如果沒有開啟調試模式則不會加載調試配置文件(系統/項目調試配置文件)的,而且調試配置文件(系統/項目)會覆蓋項目配置文件中的相同項!
文件加載順序(很重要)如下
系統配置文件---》項目配置文件---》系統調試配置文件 PS,注意,要么是加載系統調試配置文件,要么加載項目調試配置文件,並不會像配置文件
---》項目調試配置文件 那樣,首先加載系統配置文件再加載項目配置文件
4、運行狀態
開啟調試模式后,默認會顯示頁面的運行狀態信息,包括運行時間、數據庫讀寫次數、緩存讀寫次數、內存開銷,例如
而運行狀態信息並非必須得在調試模式下才能顯示,也是可以直接在項目配置文件中進行單獨配置的,可以配置一項或多項
注意,這些信息默認是在模板的最后顯示的,但是如果你希望在模板其它地方顯示,那么可以通過將{__RUNTIME__}等等模板系統變量放到指定的位置顯示
5、頁面Trace
頁面Trace是ThinkPHP用於開發調試的輔助手段,在系統調試配置文件中是默認開啟的
·默認的Trace信息包括如下項
·還可以自定義Trace信息
方式一:在應用目錄->Config目錄下新建一個trace.php文件,內容格式與項目配置文件一樣(返回一個Aarry),比如
方式二:在動作內通過trace()方法來增加trace信息
Trace模板也是可以自定義的,上面所說的是自定義Trace信息,在自定義的Trace模板中的關鍵性代碼如下
默認的Trace模板是系統目錄->Tpl目錄->PageTrace.tpl.php文件,通過在項目配置文件中的'TMPL_TRACE_FILE'配置項進行配置,比如說'TMPL_TRACE_FILE'=>APP_PATH.'/Public/trace.php',那么項目目錄->Public目錄->trace.php文件就是自定義的Trace模板
6、手動輸出調試信息(Action調試)
有時候調試模式並不能完全滿足我們的需求,而需要手動輸出一些調試信息
·手動輸出變量信息
除了使用PHP內置的var_dump()函數和print_r()函數之外,還可以使用ThinkPHP提供的對瀏覽器更加友好的dump()函數
·獲取某代碼段的運行狀態
debug_start($label='')和debug_end($label='')函數,比如說
·中斷程序執行並輸出相關信息
halt($mes);輸出錯誤信息並終止程序執行
7、模型調試(Model調試)
在模型中,為了更好的查明錯誤,經常需要查看下最近使用的sql語句,那么ThinkPHP就提供了getLastsql()方法來輸出上次執行的sql語句
輸出結果為 SELECT * FROM think_user WHERE id = 1
8、調試類
更加高級的調試方式是使用調試類Debug,分別有三個靜態方法mark()、useTime()、useMemory(),作用分別為標記一個調試位置、返回區間所用時間、返回區間所用內存,測試如下
實際上,細心的同學可能發現用debug_start()和debug_end()所測試的相同代碼,在執行時間和使用內存上更小
注意一下,通過Debug類的源碼可知,useTime()實際上還有第三個參數
二、日志記錄
日志的處理工作是由系統自動完成的,在開啟日志記錄的情況下,會記錄允許的日志級別的所有日志信息。其中SQL級別日志只有在調試模式開啟時才有效!
系統的日志記錄由核心的Log類完成,提供了多種方式記錄下不同的級別的日志信息
1、開啟日志記錄
在項目配置文件中,添加'LOG_RECORD'=>true即可開啟日志記錄。一般在開啟日志記錄之后,緊接着要指定運行記錄的日志級別,通過'LOG_RECORD_LEVEL'=>array('日志級別',...)
2、日志級別
ps,在項目配置文件中指定日志級別的時候,填的是字串而不是常量名
3、日志記錄方式(自動記錄)
SYSTEM 通過發送到PHP的系統日志目錄 Log類中對應的常量名值是0
MAIL 通過郵件方式發送 1
TCP 通過TCP方式發送 2
FILE 通過文件方式記錄(默認方式) 3
FILE方式的文件格式
年(簡寫)_月_日.log 比如16_08_23.log表示2016年8月23日的日志文件
這里所說的都是自動記錄日志,自動記錄的日志會保存到應用目錄->Runtime目錄->Logs目錄->年(簡寫)_月_日.log文件中
·可以通過LOG_FILE_SIZE來限制日志文件的大小,超過大小的日志文件就會形成備份文件,備份文件的格式是在當前文件名的前面加上備份的時間戳,例如1189571417-07_09_12.log
·日志文件的內容格式是[時間]日志級別:日志信息
·時間顯示格式可動態配置,默認采用的[c],可以改成例如Log::format='[Y-m-d H:i:s]',ps,格式與date()函數的用法一致
4、手動記錄
通常日志文件的寫入都是自動完成的,如果需要在開發的過程中手動記錄日志信息,可以通過Log類來實現
有兩種方式
方式一:直接使用Log::write()方法一步到位
方式二:先使用Log::record()方法將日志寫入到內存中,然后再用Log::save()方法將內存中的日志寫到磁盤中