mysql debug log_PHP代码调试与日志
封面.jpg
一、代碼調(diào)試
由于PHP很少有類似java、.NET的斷點調(diào)試工具,因此通常都是要采用輸出中間結(jié)果的方式進(jìn)行調(diào)試,主要如下:
1、var_dump
對于可以直接打印的(如在controller層、view層),則使用此方法進(jìn)行打印。對于controller,如果是調(diào)用的ajax,要用此方法打印還要配合firebug等瀏覽器調(diào)試工具。
2、error_log
當(dāng)無法直接在瀏覽器輸出調(diào)試結(jié)果時(大部分情況,如service、dao等),則采用此方式,可以將需要監(jiān)視的變量打log,并在linux上用tail -f logfile查看日志最新的信息。
3、debug_zval_dump
該函數(shù)打印的變量不僅有值,還有其被引用的次數(shù)。因此當(dāng)涉及到變量的引用傳參時,采用此方式可以查看引用傳參是否正確。
4、debug_print_backtrace
該函數(shù)功能強(qiáng)大,在某個方法里面執(zhí)行該函數(shù),可以逐級查看該函數(shù)所在方法的調(diào)用點,即會返回執(zhí)行該函數(shù)所在方法的方法即執(zhí)行文件名,并返回調(diào)用其的文件名。正如函數(shù)名backtrace,其會一路追溯直至找到初始調(diào)用點。
5、firebug
對于前端調(diào)試,采用火狐瀏覽器,安裝firebug插件,功能強(qiáng)大。其可以調(diào)試js、css,對js設(shè)置斷點,打印中間變量;對css的各類樣式,可以實時調(diào)整并查看結(jié)果,不用每次改個數(shù)值再刷新頁面,只要將最終狀態(tài)的代碼復(fù)制到真實代碼即可。
6、fiddler
對于手機(jī)app的調(diào)試,當(dāng)需要知道其url,則可以通過fiddler進(jìn)行抓包。
二、日志查看
1、PHP日志
在php.ini文件中,將log_errors設(shè)置成on,并且設(shè)置其loglevel,可以設(shè)置成php的十多種錯誤類型的某些種,再設(shè)置error_log的文件路徑。這樣,當(dāng)php運行期間發(fā)生的錯誤,會記錄錯誤日志,便于定為原因。
2、Apache日志
Apache默認(rèn)開啟錯誤日志,在httpd.conf里面進(jìn)行配置,如下:
ErrorLog“Logs/error.log”
CustomLog“Logs/access.Log” common
其中,errorlog是錯誤日志,主要內(nèi)容包括錯誤日期時間、錯誤的等級、導(dǎo)致錯誤的ip、信息具體內(nèi)容。
cumstomlog是訪問日志,日志包括發(fā)送請求的服務(wù)器ip、服務(wù)器完成請求處理的時間、客戶端發(fā)出的請求行、服務(wù)器狀態(tài)碼、返回給客戶端的不包括響應(yīng)頭的字節(jié)數(shù)。
3、Nginx日志
Nginx錯誤日志在.conf配置文件中,可以定義在main區(qū)塊或者虛擬主機(jī)的配置文件中,定義方法如下:
error_logpath/to/file/error.log error_level;
錯誤級別有8種,級別越高則記錄的日志內(nèi)容越少。
和apache類似,nginx也有訪問日志的記錄。
4、mysql日志
mysql分為4種日志:錯誤日志、二進(jìn)制日志、查詢?nèi)罩竞吐樵內(nèi)罩尽?/p>
1)錯誤日志
默認(rèn)文件名是hostname.err,放在DATADIR目錄。當(dāng)mysql無法啟動,或者其他情況下服務(wù)器報錯,可以從這里進(jìn)行查看。
日志文件是文本文件,可以直接打開。
2)二進(jìn)制日志
二進(jìn)制日志包含所有的對數(shù)據(jù)庫數(shù)據(jù)的更新或者潛在更新,包括所有的DDL語句,以及DML語句中的增刪改。
文件是二進(jìn)制文件,無法直接打開,可以用mysql提供的mysqlbinlog查看。查看方式:mysqlbinlog 文件名。
日志中記錄了完整的操作的sql語句,以及操作時間,以便分析定位。
3)查詢?nèi)罩?/p>
通過配置文件配置Log選項啟用,方法如下:
Log= ‘/path/to/logfile.log’
由于該配置會將每一條sql的語句都記錄,因此通常文件會很大,只適合在開發(fā)、測試期間本地開啟,而線上通常不開啟此功能。
4)慢查詢?nèi)罩?/p>
在配置文件中可以定義慢查詢的時間,即sql執(zhí)行的時間超過配置的時間,被定義為慢查詢,會記錄相應(yīng)的log。配置方法如下:
Log-slo-queries=’/path/to/logfile.log’
long_query_time=second
上述第一行是配置日志的記錄位置,第二行是記錄時間,單位是秒,如second寫的是1,則執(zhí)行超過1秒的sql都會被當(dāng)作慢查詢。
慢查詢的定位對于問題排查、性能優(yōu)化具有重要作用,因此線上通常會開啟,并且每天需要查看是否有慢查詢,并且在業(yè)務(wù)許可的情況下對sql或者調(diào)用的代碼進(jìn)行優(yōu)化。
三、單元測試
單元測試又稱為模塊測試,是對代碼中最小的部分(即方法)進(jìn)行測試。由于大部分的邏輯都放在service,因此通常只對service進(jìn)行單元測試。
PHP的單元測試有一個優(yōu)秀的單元測試工具,PHPUnit,其可以很方便的對代碼進(jìn)行單元測試,并且可以將結(jié)果輸出,查看單元測試的代碼覆蓋率、單元測試成功率等內(nèi)容。
1、斷言(assert)
單元測試中,一個很重要的內(nèi)容叫做斷言,命令是assert()。關(guān)于斷言,phpunit提供了非常多的斷言方式,涵蓋true、false、非空、空、count、等于、大于、小于、null等諸多內(nèi)容,具體可以查看phpunit官方文檔。
斷言是用來判斷單元測試中,方法的執(zhí)行結(jié)果是否符合預(yù)期的重要依據(jù)。
2、樁(stub、mock)
單元測試的基本原則是模塊化,因此對某個方法的單元測試,如果方法里面還有調(diào)用其它類的方法,則是默認(rèn)那些方法都要返回期望的結(jié)果。即,對方法的單元測試,不依賴于其他方法。
因此,需要對其他的調(diào)用方法進(jìn)行加樁操作??梢岳斫鉃槔胮hpunit提供的mock函數(shù),將執(zhí)行調(diào)用其他類的那一行命令替換掉,直接返回需要的結(jié)果。
但是,對于本類內(nèi)部的方法調(diào)用、對于所有的常量、靜態(tài)方法、靜態(tài)變量的調(diào)用,則無法加樁。
3、代碼覆蓋率
通常,單元測試要求代碼覆蓋率盡量在100%,即如果里面有if、elseif、else條件,或者switch、case語句,需要把其中的每一項都測試過去,確保每種情況下的代碼都是正常運行的。為了實現(xiàn)此方法,數(shù)據(jù)供給器(dataprovider)是phpunit提供的一個很好的模塊。
四、壓力測試
對于壓力測試,可以采用ab、jmeter對代碼進(jìn)行壓測,采用mysqlslap、jmeter對mysql進(jìn)行壓測,采用jmeter+badboy錄制過程,并將結(jié)果導(dǎo)出進(jìn)行壓測。這些工具具體用到的時候查看官方文檔即可。
總結(jié)
以上是生活随笔為你收集整理的mysql debug log_PHP代码调试与日志的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 段码液晶屏笔段电压范围_液晶屏逻辑板和屏
- 下一篇: jfinal连接oracle_JFina