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