php程式調試方法總結

來源:互聯網
上載者:User

   相信很多朋友們都有偵錯工具的經曆,然而很多時候偵錯工具是痛苦而又漫長的過程;它不僅需要細心,更需要耐心,切忌心浮氣躁。但是當找出問題並順利解決它時,又會給人無比激動的喜悅。這裡總結一下筆者在程式調試中的使用的原則,工具,以及方法。這裡需要說明的是,某些原則性的東西,各種語言都是差不多的,而涉及到具體的工具和某些具體的調試方法,這裡只涉及web開發方面的內容。

  總體原則:

  1.找出問題原因:

  程式需要調試,是因為程式有問題。而調試的第一目標是找到原因。常見調試方法, 排除法: 當我們面對整個複雜的系統時,常常完全不知道問題出在什麼地方;這個時候可以先將與問題不相關的地方排排除,逐漸縮小調試範圍。獨立模組法: 大部分程式都有模組結構,將可疑模組單獨拿出來,類比輸入相應的操作資料,看是否出現問題。比較法:如果程式或系統是基於某個平台時,可以先看看其他基於本平台的程式或系統,找出是平台問題還是本程式問題,很多時候這種方法是用來排除不成熟平台上的隱藏問題。對比法:對於自己實現的程式,可能已經有相應的開源的模組,可以把這些程式源碼找出來,和自己的程式進行對比,這樣不僅節省時間,還能借鑒別人的優秀之處。

  2.問題定位:

  問題原因的多種多樣,可能這個時候你只能知道是什麼樣的問題, 可能與什麼相關, 這個時候就需將出現的程式碼片段找出來。而需要做到這一步,一般開發環境為我們提供很多工具 + 生產力,藉助這些工具,可以一步一步地查看程式的輸入和輸出,根據每一步的輸入輸出,定位問題。

  有一部分很厲害的人,可以通過閱讀代碼,找到出現問題的地方。但是很多問題都是調試者自己因為疏忽造成的,而要通過這樣方式去尋找問題,幾乎是不可能的,因為已經形成固定的思維定勢。

  3.解決問題

  找到問題的原因和相應程式碼,解決它很多時候是一件比較簡單的事,因為這些問題往往自己疏忽或者自己考慮不周。但是某些時候並不總是這樣的,而是由於外部環境造成的,比如你的網站訪問的人數增多,你當初沒有考慮到這些資料壓力,同時也沒有考慮到高度並發性的問題,這個時候問題解決起來是你覺得比較棘手。而要解決這樣的問題,不僅僅要專註程式, 更要從系統架構方面著手,綜合各方面的知識,進行全面的考慮。

  web開發常用調試工具

  俗話說:工欲善其石,必先利其器。對於程式的調試,也必須藉助外部工具。這裡介紹幾種在開發web程式中常常用到的工具:

  xdebug, xhprof:php效能調試工具。他們都是php的一種擴充,可以很方便的安裝和配置。這兩個工具主要是將你程式的內部健全狀態,調用函數以一種簡潔的方式告訴你。讓你對程式在什麼地方佔用過多的資源,那些地方需要進行最佳化一目瞭然。 順便提一下,xdebug產生的profile檔案一般藉助winCacheGrid查看。

  firephp, firbug: 前者主要是php的調試工具,而後者是web開發必不可少的工具, 它不僅能查看請求,還能調試js,css。

  在ie下面可以使用HttpWatch。如果需要將資料做深入分析,可以使用抓包工具。

  php中常使用的調試函數:error_report, var_dump, print_r, var_export

  mysql,apache/nginx的常用的調試技巧:分析他們記錄檔也是相當重要。在linux下查看記錄檔的常用命令: cat, more, less, grep, awk, sed

  常見的調試技巧和方法

  下面以我調試的程式來介紹一下具體的調試方法和技巧。

  例子1: 這是一個php開發的遊戲引擎,主要功能提供雙發球員移動位置,狀態,傳球,技能等功能控制,整個程式通過xml檔案儲存結果。突然某天,有兩個使用者進行比賽,返回的xml不符合正常的結構。從返回的結果來看,球員的移動位置有些不正常,其中少了某些步驟,於是決定從遊戲的AI入手尋找,但是也沒有發現此處有什麼異常。最後將輸入的球員資料列印出來,然後將中間產生的資料也列印出來,結合程式的處理邏輯,發現是這兩個使用者有同一個球員,因此導致在處理的時候, 兩個人的球員出現混亂。找到原因後,就將這個以球員標識改為以球隊和球員共同決定即可。

  例子2:程式剛上線, 有些熱心的朋友們喜歡對程式進行一些壓力測試。某次突然20w的請求很大的一個靜態資源,直接導致硬碟癱瘓。對於這種情況,必須查看訪問日誌,才知道發生什麼事。否則人家對你攻擊了, 你還找不到原因。當然對於這樣的攻擊,直接把靜態資源放到cdn上。另外,隨著訪問使用者量的增大,系統的壓力增大, 反應逐漸層慢,我們不得不考慮:以前只需要0.000幾毫秒能處理的程式,現在需要0.幾秒。這個時候程式的並發性設計就很重要了。否則會造成資料異常的情況。

  例子3:使用外部軟體出現異常:例如使用memcached的時候,如果某台沒有啟動或者不能使用了。這個時候nginx一般就會對某些使用memcache的請求返回502,是不是感覺有點無厘頭,可以考慮改寫memcahce 的php擴充了

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.