多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > ThinkPHP > ThinkPHP3.1快速入門(7)調試

ThinkPHP3.1快速入門(7)調試

來源:程序員人生   發布時間:2014-05-23 16:32:49 閱讀次數:3515次
本篇我們來全面了解下如何在ThinkPHP開發過程中進行調試工作。

調試模式

說到調試,我們可能第一個想到的就是調試模式,沒錯,ThinkPHP也有專門為開發過程而設置的調試模式,ThinkPHP的調試模式與眾不同,會犧牲一定的執行效率,但帶來的方便和除錯功能非常值得。 我們強烈建議ThinkPHP開發人員在開發階段始終開啟調試模式(直到正式部署后關閉調試模式),方便及時發現隱患問題和分析、解決問題。[-more-]
開啟調試模式很簡單,只需要在入口文件中增加一行常量定義代碼:
<?php
//開啟調試模式
define('APP_DEBUG', true);
//加載框架入口文件
require './ThinkPHP/ThinkPHP.php';
在完成開發階段部署到生產環境后,只需要刪除調試模式定義代碼即可切換到部署模式。 調試模式的優勢在于:
  • 開啟日志記錄,任何錯誤信息和調試信息都會詳細記錄,便于調試;
  • 關閉模板緩存,模板修改可以即時生效;
  • 記錄SQL日志,方便分析SQL;
  • 關閉字段緩存,數據表字段修改不受緩存影響;
  • 嚴格檢查文件大小寫(即使是Windows平臺),幫助你提前發現Linux部署問題;
  • 可以方便用于開發過程的不同階段,包括開發、測試和演示等任何需要的情況,不同的應用模式可以配置獨立的項目配置文件;
在開啟調試模式的狀態下,我們可以給項目設置不同的應用狀態,并加載不同的項目配置文件,但是無論如何,都會首先導入框架默認的調試模式配置文件,該文件位于系統目錄的Confdebug.php。
通常情況下,調試配置文件里面可以進行一些開發模式所需要的配置。例如,配置額外的數據庫連接用于調試,開啟日志寫入便于查找錯誤信息、開啟頁面Trace輸出更多的調試信息等等。
如果沒有配置應用狀態,系統默認則默認為debug狀態,也就是說默認的配置參數是:
 'APP_STATUS' => 'debug', //應用調試模式狀態
如果檢測到項目的配置目錄中有存在debug.php文件,則會自動加載該配置文件,并且和系統項目配置文件以及系統調試配置文件合并,也就是說,debug.php配置文件只需要配置和項目配置文件以及系統調試配置文件不同的參數或者新增的參數。 如果想在調試模式下面增加應用狀態,例如測試狀態,則可以在項目配置文件中改變設置如下:
    'APP_STATUS' => 'test', //應用調試模式狀態
這樣的話,系統會自動嘗試加載項目配置目錄下面的test.php 配置文件,可以在test配置文件中改變相關設置,例如改變測試數據庫的連接信息等等。
由于調試模式沒有任何緩存,因此涉及到較多的文件IO操作和模板實時編譯,所以在開啟調試模式的情況下,性能會有一定的下降,但不會影響部署模式的性能。另外需要注意的是,一旦關閉調試模式,項目的調試配置文件即刻失效。

頁面Trace

調試模式并不能完全滿足我們調試的需要,有時候我們需要手動的輸出一些調試信息。除了本身可以借助一些開發工具進行調試外,ThinkPHP還提供了一些內置的調試工具和函數。例如,頁面Trace功能就是ThinkPHP提供給開發人員的一個用于開發調試的輔助工具。可以實時顯示當前頁面的操作的請求信息、運行情況、SQL執行、錯誤提示等,并支持自定義顯示。 頁面Trace功能對調試模式和部署模式都有效,不過只能用于有頁面輸出的情況(如果你的操作沒有任何輸出,那么可能頁面Trace功能對你幫助不大,你可能需要使用后面的調試方法)。但是在部署模式下面,顯示的調試信息沒有調試模式完整,通常我們建議頁面Trace配合調試模式一起使用。
要開啟頁面Trace功能,需要在項目配置文件中設置:
'SHOW_PAGE_TRACE' =>true, // 顯示頁面Trace信息
該參數默認為關閉,開啟后并且你的頁面有模板輸出的話,頁面右下角會顯示ThinkPHP的LOGO:

我們看到的LOGO后面的數字就是當前頁面的執行時間(單位是秒) 點擊該圖標后,會展開詳細的頁面Trace信息,如圖:

頁面Trace框架有6個選項卡,分別是基本、文件、流程、錯誤、SQL和調試,點擊不同的選項卡會切換到不同的Trace信息窗口。
基本:當前頁面的基本摘要信息,例如執行時間、內存開銷、文件加載數、查詢次數等等。
文件:詳細列出當前頁面執行過程中加載的文件及其大小。
流程:會列出當前頁面執行到的行為和相關流程(待完善)。
錯誤:當前頁面執行過程中的一些錯誤信息,包括警告錯誤。
SQL:當前頁面執行到的SQL語句信息。
調試:開發人員在程序中進行的調試輸出。
頁面Trace的選項卡是可以定制和擴展的,默認的配置為:
'TRACE_PAGE_TABS'=>array(
    'base'=>'基本',
    'file'=>'文件',
    'think'=>'流程',
    'error'=>'錯誤',
    'sql'=>'SQL',
    'debug'=>'調試'
)
也就是我們看到的默認情況下顯示的選項卡,如果你希望增加新的選項卡:用戶,則可以修改配置如下:
'TRACE_PAGE_TABS'=>array(
    'base'=>'基本',
    'file'=>'文件',
    'think'=>'流程',
    'error'=>'錯誤',
    'sql'=>'SQL',
    'debug'=>'調試',
    'user'=>'用戶'
)
也可以把某幾個選項卡合并,例如:
'TRACE_PAGE_TABS'=>array(
    'base'=>'基本',
    'file'=>'文件',
    'think'=>'流程',
    'error|debug|sql'=>'調試',
    'user'=>'用戶'
)
我們把剛才的用戶信息調試輸出到用戶選項卡,trace方法的用法如下:
trace($user,'用戶信息','user');
第三個參數表示選項卡的標識,和我們在TRACE_PAGE_TABS中配置的對應。
默認情況下,頁面Trace窗口顯示的信息是不會保存的,如果希望保存這些trace信息,我們可以配置PAGE_TRACE_SAVE參數:
'PAGE_TRACE_SAVE'=>true
開啟頁面trace信息保存后,每次的頁面Trace信息會以日志形式保存到項目的日志目錄中,命名格式是: 當前日期_trace.log,例如:
12-06-21_trace.log
如果不希望保存所有的選項卡的信息,可以設置需要保存的選項卡,例如:
'PAGE_TRACE_SAVE'=>array('base','file','sql');
設置后只會保存base、file和sql三個選項卡的信息。

Trace方法

頁面Trace只能用于有頁面輸出的情況,但是trace方法可以用在任何情況,而且trace方法可以用于AJAX等操作。
Trace方法的格式: trace('變量','標簽','級別','是否記錄日志') 例如:
$info = '測試信息';
trace($info,'提示');
如果希望把變量調試輸出到頁面Trace的某個選項卡里面,可以使用:
trace($info,'提示','user');
表示輸出到user選項卡,如果沒有指定選項卡的話,默認會輸出到debug選項卡。
trace方法也可以直接拋出異常,如果是輸出到ERR選項卡,并且開啟
'TRACE_EXCEPTION'=>true
的話,
trace($info,'錯誤','ERR');
會拋出異常。
有三種情況下,trace方法會記錄日志:
  • AJAX請求
  • SHOW_PAGE_TRACE為false,也就是頁面Trace關閉的情況下
  • trace方法的第四個參數為true
在這種情況下,trace方法的第三個參數就表示記錄的日志級別,通常包括:
'ERR'  // 一般錯誤: 一般性錯誤
'WARN'  // 警告性錯誤: 需要發出警告的錯誤
'NOTIC'  // 通知: 程序可以運行但是還不夠完美的錯誤
'INFO'  // 信息: 程序輸出信息
'DEBUG'  // 調試: 調試信息
'SQL'  // SQL:SQL語句

變量調試

輸出某個變量是開發過程中經常會用到的調試方法,除了使用php內置的var_dump和print_r之外,ThinkPHP框架內置了一個對瀏覽器友好的var_dump方法,用于輸出變量的信息到瀏覽器查看。
dump 瀏覽器友好的變量輸出
用法 dump($var, $echo=true, $label=null, $strict=true)
參數 var(必須):要輸出的變量,支持所有變量類型
echo(可選):是否直接輸出,默認為true,如果為false則返回但不輸出
label(可選):變量輸出的label標識,默認為空
strict(可選):輸出變量類型,默認為true,如果為false則采用print_r輸出
返回值 如果echo參數為false 則返回要輸出的字符串
使用示例:
$Blog = D("Blog");
$blog = $Blog->find(3);
dump($blog);
在瀏覽器輸出的結果是:
array(12) {
  ["id"]           => string(1) "3"
  ["name"]         => string(0) ""
  ["user_id"]       => string(1) "0"
  ["cate_id"]   => string(1) "0"
  ["title"]        => string(4) "test"
  ["content"]      => string(4) "test"
  ["create_time"]        => string(1) "0"
  ["update_time"]        => string(1) "0"
  ["status"]       => string(1) "0"
  ["read_count"]    => string(1) "0"
  ["comment_count"] => string(1) "0"
  ["tags"]         => string(0) ""
}

性能調試

開發過程中,有些時候為了測試性能,經常需要調試某段代碼的運行時間或者內存占用開銷,系統提供了G方法可以很方便的獲取某個區間的運行時間和內存占用情況。 例如:
G('begin');
// ...其他代碼段
G('end');
// ...也許這里還有其他代碼
// 進行統計區間
echo G('begin','end').'s';
G('begin','end') 表示統計begin位置到end位置的執行時間(單位是秒),begin必須是一個已經標記過的位置,如果這個時候end位置還沒被標記過,則會自動把當前位置標記為end標簽,輸出的結果類似于:
0.0056s
默認的統計精度是小數點后4位,如果覺得這個統計精度不夠,還可以設置例如:
G('begin','end',6).'s';
可能的輸出會變成:
0.005587s
如果你的環境支持內存占用統計的話,還可以使用G方法進行區間內存開銷統計(單位為kb),例如:
echo G('begin','end','m').'kb';
第三個參數使用m表示進行內存開銷統計,輸出的結果可能是:
625kb
同樣,如果end標簽沒有被標記的話,會自動把當前位置先標記位end標簽。
如果環境不支持內存統計,則該參數無效,仍然會進行區間運行時間統計。

斷點調試

憑借強大的頁面Trace信息功能支持,ThinkPHP可以支持斷點調試功能。
我們只需要在不同的位置對某個變量進行trace輸出即可,例如:
$blog = D("Blog");
$vo = $blog->create();
trace($vo,'create vo');
$vo = $blog->find();
trace($vo,'find vo');

錯誤調試

如果需要我們可以使用下面的方法輸出錯誤信息并中斷執行:
halt($msg)  //輸出錯誤信息,并中止執行

模型調試

在模型操作中 ,為了更好的查明錯誤,經常需要查看下最近使用的SQL語句,我們可以用getLastsql方法來輸出上次執行的sql語句。例如:
$User = M("User"); // 實例化User對象
$User->find(1);
echo $User->getLastSql();
輸出結果是
SELECT * FROM think_user WHERE id = 1
并且每個模型都使用獨立的最后SQL記錄,互不干擾,但是可以用空模型的getLastSql方法獲取全局的最后SQL記錄。
$User = M("User"); // 實例化User模型
$Info = M("Info"); // 實例化Info模型
$User->find(1);
$Info->find(2);
echo M()->getLastSql();
echo $User->getLastSql();
echo $Info->getLastSql();
輸出結果是
SELECT * FROM think_info  WHERE id = 2
SELECT * FROM think_user  WHERE id = 1
SELECT * FROM think_info  WHERE id = 2
getLastSql方法只能獲取最后執行的sql記錄,如果需要了解更多的SQL日志,可以通過查看當前的頁面Trace或者日志文件。

注意:Mongo數據庫驅動由于接口的特殊性,不存在執行SQL的概念,因此SQL日志記錄功能是額外封裝實現的,所以出于性能考慮,只有在開啟調試模式的時候才支持使用getLastSql方法獲取最后執行的SQL記錄。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: freesexmovies性医生 | 国产一级视频久久 | 女人18毛片a级18毛多水真多 | 精品成人乱色一区二区 | 欧美日韩精品一区二区三区视频在线 | 国产精品久久免费 | 国产精品亚洲一区二区三区久久 | 老司机午夜免费福利视频 | 69视频在线免费观看 | 欧美xxxxx九色视频免费观看 | 亚洲精品国产福利在线观看 | 日本一区二区三区四区五区 | 小说区 图片区 | 国产中文字幕在线视频 | 亚洲天堂首页 | 欧美成人综合在线观看视频 | 国产亚洲欧美在线 | 欧美激情福利视频在线观看免费 | 国产在线成人一区二区 | 国产精品天天看天天爽 | 国产v片在线观看 | 亚洲天堂视频在线免费观看 | 黄视频在线观看www 黄网站大全 | 久草一级片 | 免费一级淫片aaa片毛片a级 | 国产一国产一级毛片视频 | 久久免费观看国产精品 | 亚洲黄色大全 | 微信影院手机在线播放 | 免费成年人视频在线观看 | 国产精品视频永久免费播放 | 亚洲人成伊人成综合网久久久 | 亚洲视频网站在线观看 | 日本在线视频一区 | 青草超级碰碰在线视频 | 手机看片手机在线看片 | 97在线视频99播放 | 欧美日本韩国一区二区 | 国产美女视频一区二区二三区 | 国内外一级毛片 | 亚洲国产成a人v在线 |