有些PHP程式設計師,不知道如何有效的除錯BUG
點選進入“PHP開源社群”
免費獲取進階面試、文件、視訊資源
Bug年年有,今年特別多,特別是剛開發不久的友友們,經常會寫一些bug。但是不怕,除錯bug也是有方法的。
除錯的定義:通過一定方法,在程式中找到並減少缺陷的數量,從而使其能正常工作。
這裡說一些如何除錯PHP程式的經驗。
一、PHP自帶的除錯功能
1、自帶的報錯功能
兩個名詞:開發環境是開發人員在進行開發和除錯的環境,生產環境是最終客戶在用的線上環境;
開發環境和生產環境要分開設定報錯功能。
(1)開發環境
開發環境需要開啟報錯,以下是php.ini的配置項及其說明 :
; This directive sets the error reporting level. ; Development Value: E_ALL | E_STRICT (Show all errors, warnings and notices including coding standards.) error_reporting = E_ALL | E_STRICT ; This directive controls whether or not and where PHP will output errors, ; notices and warnings too. Error output is very useful during development. ; Development Value: On display_errors = On
這樣你在開發過程中,能第一時間發現錯誤。
即使是一個低等級的報錯“Notice: Undefined variable: a in E:\phpspace\test.php on line 14”,但一個未定義的變數的使用往往暗藏著bug。
你會問,如果我引進了開源的類庫,他們丟擲一堆的低等級錯誤怎麼辦?一般程式碼質量好的類庫,也沒有“Notice”級別的報錯的。所以這也是鑑別一個類庫質量的方法。
(2)生產環境
生產環境不能直接將錯誤輸出,而是記入日誌,以下是php.ini的配置項及其說明:
; It could be very dangerous in production environments. ; It's recommended that errors be logged on production servers rather than ; having the errors sent to STDOUT. display_errors = Off ; Besides displaying errors, PHP can also log errors to locations such as a ; server-specific log, STDERR, or a location specified by the error_log ; directive found below. While errors should not be displayed on productions ; servers they should still be monitored and logging is a great way to do that. ; Production Value: On log_errors = On ; Log errors to specified file. error_log = /path/to/php_error.log
當然日誌寫到檔案裡只是一個選擇,還有其他配置可參考手冊。
生產環境是給客戶提供服務的,你不可能在上面進行斷點、列印輸出等操作,所以日誌是不錯的選擇。
2、其他一些語言特性、功能的使用
(1)少用錯誤控制運算子“@”
其的作用是,將“@”放置在一個PHP表示式之前,該表示式可能產生的任何錯誤資訊都被忽略掉。
如果一個缺陷發生在這個表示式中,從PHP的輸出中看不到任何錯誤,這增加了除錯的難度。所以能不用則不用。
(2)有些函式自帶有debug功能
比如這行程式碼:
$fp = fsockopen(“www.example.com”, 80, $errno, $errstr, 30);
開發者除錯時已經確定,$fp為空,連線失敗,是這一行有問題,但是為什麼連線失敗?
函式是php自帶的,無法進行更深入的除錯。所以一般這樣的函式(主要是網路通訊類的),會自己提供除錯引數:$errno和$errstr。你可以加一句:
if (!$fp) echo “$errstr ($errno)
\n”;
就能看到連線失敗的原因了。
這些函式有:fsockopen,pfsockopen,stream_socket_server,stream_socket_client 等。
還有些函式是除錯一個功能用的,比如:mysql_errno,socket_last_error,socket_strerror 等。
這些只需要瞭解下,碰到能想到用即可。
二、引進除錯工具
在遇到複雜問題時,可以藉助除錯工具。比較成熟的有Xdebug、ZendDebugger。
以Xdebug為例,它能夠:控制列印輸出的樣式和陣列層級、堆疊式的追蹤錯誤、追蹤函式呼叫、程式碼執行覆蓋分析、程式的概要分析(Profiling)、遠端除錯。
Xdebug前兩個功能是對PHP原有的除錯功能做了改進,更方便除錯。
複雜的問題,除錯不出來的,可能是業務上的的問題,下面也有說業務邏輯的除錯。
三、除錯業務邏輯錯誤
當PHP指令碼跑起來,沒有任何錯誤,只能說它沒有語法上的錯誤,但是不能說明它業務邏輯上沒錯誤。
很多業務邏輯的錯誤並不會反映在語法錯誤上,但除錯的思路和PHP自帶除錯功能差不多。
下面是一些方法。
1、最基本的除錯方法
先確定兩個東西:程式預期的結果、程式現在的不符合預期的結果;
尋找與兩種結果相關的程式碼片段;
閱讀這些程式碼片段,嘗試以“肉眼”找出錯誤;
找不出,則需要輸出一些關鍵變數,通過檢查它們的值是否正確來判斷是哪裡發生了錯誤;
若干次嘗試,最終你可以確定錯誤發生在哪個點。
你也可以藉助Xdebug等工具,檢視變數值的變化,或者設定斷點進行除錯。
2、記錄執行日誌
有些複雜或特殊的業務,用上面的方法不合適,比如:一個不能被打斷的後臺執行指令碼。這些情況下記錄執行日誌比較合適。
記日誌的點要有所選擇,除了業務上比較重要的點,通常容易出錯的地方有:網路連線和通訊、系統許可權問題等。
3、單元測試
以程式碼測試程式碼,而不是像第一點一樣除錯完會把測試程式碼丟掉。以測試驅動開發。
這個話題比較大,但適合放這裡提一下。有興趣的同學可以去了解。
四、除錯非功能性的錯誤
非功能性錯誤,比如:記憶體溢位導致程式掛掉了、效率有問題導致程式非常慢、死迴圈了等等。
這些問題,用“肉眼”檢查程式碼效率太低了。
所以可以藉助除錯工具做程式的概要分析(Profiling),從中檢查出程式的瓶頸所在。
*宣告:本文於網路整理,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。
END
PHP開源社群
掃描關注 進入”PHP資料“
免費獲取進階
面試、文件、視訊資源
點選“檢視原文”獲取更多
- 用“最好的語言”PHP,做一個機器學習資料集
- PHP開發中,如何做錯誤與異常處理呢 ?
- phper如何用Rust開發PHP擴充套件Liunx版【詳細教程】
- PHP 使用 CURL 詳解
- 小程式如何使用訂閱訊息(PHP程式碼 小程式js程式碼)
- MySQL提高效能,緩解資料庫壓力,你會做讀寫分離嗎?
- 深入理解 glibc malloc:記憶體分配器實現原理
- Laravel 成為最佳 PHP 框架的 14 個理由!
- 7 款顏值 yyds 的 Linux 作業系統 !
- 一文了解“最好程式語言”PHP 必知的 16 個程式設計法則!
- 終於有人把 "單點" 登入說清楚了!
- PHP程式執行Python指令碼(接收資料及傳參)
- 服務端 TCP 連線 TIME_WAIT 怎麼破?
- Shell 分析日誌檔案命令全面總結!
- 有些PHP程式設計師,不知道如何有效的除錯BUG
- 10個你可能不曾用過卻很有用的 Linux 命令
- PHP如何解決百萬級全站使用者訊息推送問題
- PHP Redis快取技術一覽
- Seata-php 入門與下半年展望
- 3 個PHP 知識總結:Memcache、快取和正則