XDEBUG 從入門到精通

clipboard.png

前言

Xdebug是PHP的擴展,用於協助調試和開發。php

  • 它包含一個用於IDE的調試器
  • 它升級了PHP的var_dump()函數
  • 它爲通知,警告,錯誤和異常添加了堆棧跟蹤
  • 它具備記錄每一個函數調用和磁盤變量賦值的功能
  • 它包含一個分析器
  • 它提供了與PHPUnit一塊兒使用的代碼覆蓋功能。

猿生必備的工具。
但不推薦在生產環境中使用xdebug,由於他過重了。git

安裝

PECL 安裝

pecl install xdebug
zend_extension="/usr/local/php/modules/xdebug.so"

源碼包安裝

https://xdebug.org/download.php 尋找對應的包github

wget xxx.gz
./configure
make && make install
zend_extension="/usr/local/php/modules/xdebug.so"

Docker安裝

如下爲php dockerfile內部份內容web

RUN pecl install xdebug
RUN echo 'zend_extension=xdebug.so' >> /usr/local/etc/php/conf.d/xdebug.ini

工做原理

IDE(如PHPStorm)已經集成了一個遵循BGDP的XDebug插件,當開啓它的時候, 會在本地開一個XDebug調試服務,監聽在調試器中所設置的端口上,默認是9000,這個服務就會監聽全部到9000端口的連接。chrome

clipboard.png

當瀏覽器發送一個帶 XDEBUG_SESSION_START 的參數的請求到服務器時,服務器接受後將其轉到後端的php處理,若是php開啓了XDebug模塊,則會將debug信息轉發到客戶端IP的IDE的調試端口上。docker

clipboard.png

當參數或者cookie信息中不帶 XDEBUG_SESSION_START ,則不會啓動調試。這就爲後續在瀏覽器中添加開關提供了可能。express

基本配置

通常狀況下,你都只需瞭解,無需修改。後端

名稱 類型 默認值 註解
xdebug.default_enable boolean 1 堆棧跟蹤,默認開啓,是xdebug基礎功能之一
xdebug.force_display_errors integer 0 默認關閉,若是這個設置設置爲1,那麼不管PHP的display_errors設置爲何,都將始終顯示錯誤。
xdebug.force_error_reporting integer 0 默認關閉,容許強制顯示某些錯誤
xdebug.halt_level integer 0 默認關閉,設置接收某些指定錯誤
xdebug.max_nesting_level integer 256 控制無限遞歸(死循環)的保護機制,默認是256
xdebug.max_stack_frames integer -1 控制有多少堆棧幀顯示在堆棧跟蹤中,在PHP錯誤堆棧跟蹤的命令行中,以及在瀏覽器中顯示HTML跟蹤。
xdebug.scream boolean 0 默認關閉,若是該設置爲1,那麼Xdebug將禁用@(關閉)操做符,以便再也不隱藏通知、警告和錯誤。

具體內容請移步官網 https://xdebug.org/docs/basic數組

打印配置

Xdebug將替換PHP的var_dump()函數來顯示變量。Xdebug版本包含了不一樣類型的不一樣顏色,並對數組元素/對象屬性的數量、最大深度和字符串長度進行了限制。還有一些其餘函數也處理變量顯示。瀏覽器

名稱 類型 默認值 註解
xdebug.cli_color integer 0 cli模式下輸入結果是否設置顏色
xdebug.overload_var_dump boolean 2 是否容許xdebug重載var_dump函數
xdebug.var_display_max_children integer 128 var_dump 對數組對象子級的顯示層數限制
xdebug.var_display_max_data integer 512 var_dump 對結果長度的限制
xdebug.var_display_max_depth integer 3 var_dump 對默認顯示嵌套的層數的限制

具體內容請移步官網 https://xdebug.org/docs/display

堆棧跟蹤配置

當Xdebug被激活時,當PHP決定顯示一個通知、警告、錯誤等時,它將顯示一個堆棧跟蹤。堆棧跟蹤顯示的信息以及它們的顯示方式能夠配置爲適合您的須要。

名稱 類型 默認值 註解
xdebug.cli_color integer 0 cli模式下輸入結果是否設置顏色
xdebug.collect_includes boolean 1 控制Xdebug是否應該將include()、include_once()、require()或require_once()中的文件名寫入跟蹤文件
xdebug.collect_params integer 0 該設置默認爲0,控制當函數跟蹤或堆棧跟蹤記錄函數調用時,Xdebug是否應該收集傳遞給函數的參數
xdebug.collect_vars boolean 0 這個設置告訴Xdebug在特定範圍內使用哪些變量。因爲Xdebug必須逆向工程PHP的操做碼數組,這種分析可能至關緩慢。對於使用xdebug.collect_params,此設置不會記錄不一樣變量的值。只有當您但願使用xdebug_get_declared_vars()時,才須要啓用此設置。
xdebug.dump.* string empty * 能夠是任何COOKIE、文件、GET、POST、REQUEST、SERVER、SESSION。這七個設置控制在發生錯誤時顯示來自超全局變量的哪些數據。
xdebug.dump_globals boolean 1 當該設置設置爲true時,Xdebug將添加經過Xdebug.dump配置的超級全局變量的值*到屏幕上的堆棧跟蹤和錯誤日誌。
xdebug.dump_once boolean 1 控制是否應該在全部錯誤狀況(設置爲0)上轉儲超全局變量的值,或只在第一個錯誤狀況下轉儲超全局變量的值(設置爲1)
xdebug.dump_undefined boolean 0 若是您想從超全局變量中轉儲未定義的值,您應該將該設置設置爲1,不然將其設置爲0。
xdebug.file_link_format string 文件連接格式

具體內容請移步官網 https://xdebug.org/docs/stack...

函數調試配置

Xdebug容許記錄全部函數調用,包括參數和以不一樣格式返回的值。

名稱 類型 默認值 註解
xdebug.auto_trace boolean 0 當將此設置設置爲ture時,將在腳本運行以前啓用函數調用的跟蹤
xdebug.collect_assignments boolean 0 該設置默認爲0,控制Xdebug是否應該向函數跟蹤添加變量賦值。
xdebug.collect_includes boolean 1 該設置默認爲1,控制Xdebug是否應該將include()、include_once()、require()或require_once()中的文件名寫入跟蹤文件。
xdebug.collect_params integer 0 該設置默認爲0,控制當函數跟蹤或堆棧跟蹤記錄函數調用時,Xdebug是否應該收集傳遞給函數的參數。
xdebug.collect_return boolean 0 該設置默認爲0,控制Xdebug是否應該將函數調用的返回值寫入跟蹤文件。
xdebug.show_mem_delta integer 0 Xdebug生成的跟蹤文件將顯示函數調用之間內存使用的差別
xdebug.trace_format integer 0 跟蹤文件的格式
xdebug.trace_options integer 0 當設置爲「1」時,跟蹤文件將被附加到後面的請求中,而不是被覆蓋。
xdebug.trace_output_dir string /tmp 寫入跟蹤文件的目錄,確保PHP運行的用戶具備該目錄的寫權限。

具體內容請移步官網 https://xdebug.org/docs/execu...

垃圾收集統計信息

Xdebug的內置垃圾收集統計信息分析器容許您查明PHP內部垃圾收集器什麼時候觸發、它可以清理多少變量、它花費了多長時間以及實際釋放了多少內存。

名稱 類型 默認值 註解
xdebug.gc_stats_enable bool false 若是啓用此設置,則垃圾收集運行的統計信息將自動收集到使用xdebug.gc_stats_output_dir設置的給定目錄中, 並使用由xdebug.gc_stats_output_name配置的自動生成的名稱。
xdebug.gc_stats_output_dir string /tmp 將寫入垃圾收集統計信息輸出的目錄,確保將運行PHP的用戶具備對該目錄的寫入權限。沒法使用ini_set() 在腳本中設置此設置。
xdebug.gc_stats_output_name string gcstats.%p 此設置肯定用於將垃圾回收統計信息轉儲到的文件的名稱。該設置使用格式說明符指定格式,與sprintf() 和strftime() 很是類似。有幾種格式說明符可用於格式化文件名。

具體內容請移步官網 https://xdebug.org/docs/garba...

遠程調試配置

Xdebug爲與運行PHP腳本交互的調試器客戶機提供了一個接口。

名稱 類型 默認值 註解
xdebug.extended_info integer 1 控制Xdebug是否應該爲PHP解析器強制執行'extended_info'模式; 這容許Xdebug使用遠程調試器執行文件/行斷點。在跟蹤或分析腳本時,您一般但願關閉此選項,由於PHP生成的oparray將增長大約三分之一的大小,從而減慢腳本速度。沒法使用ini_set()在腳本中設置此設置,但只能在php.ini中設置。
xdebug.idekey string complex 控制哪些IDE Key Xdebug應傳遞給DBGp調試器處理程序。則與客戶端通訊的key
xdebug.remote_addr_header string "" 該值將用做$SERVER超全局數組中的鍵,以肯定用於查找用於「鏈接回」的IP地址或主機名的標頭
xdebug.remote_autostart boolean 0 您須要使用特定的HTTP GET / POST變量來啓動遠程調試
xdebug.remote_connect_back boolean 0 若是你不設置ip地址,就只能靠xdebug本身找了,Xdebug將嘗試鏈接到發出HTTP請求的客戶端。它檢查$_SERVER['HTTP_X_FORWARDED_FOR']和$_SERVER['REMOTE_ADDR']變量以找出要使用的IP地址
xdebug.remote_cookie_expire_time integer 3600 設置cookie的生命週期
xdebug.remote_enable boolean 0 是否開啓遠程調試
xdebug.remote_handler string dbgp 調試的通訊協議
xdebug.remote_host string localhost 調試的網絡地址,開啓了remote_connect_back後,當前配置就無效了
xdebug.remote_log string 調試的日誌
xdebug.remote_port integer 9000 調試的端口
xdebug.remote_timeout integer 200 調試的通訊連接的等待時間

具體內容請移步官網 https://xdebug.org/docs/remote

官方連接

所有配置請移步官網 https://xdebug.org/docs/all_s...
所有函數請移步官網 https://xdebug.org/docs/all_f...

PHPSTORM DEBUG

網絡上的配置DEBUG文章太雜太亂,在PHPSTROM跳來跳去的,實在讓人心煩意亂,本章從新整理描述。

配置

其實在PHPSTROM中已經出了很詳細的教程,是吧?只不過大部分人都會直接百度/Google,查詢是個好習慣,但要視狀況而定。

Languages & Frameworks > PHP > Debug

clipboard.png

第一步

下載XDEBUG擴展,本章開頭已經講過了,這裏再也不闡述。
在安裝完成後,PHPSTROM提供了驗證腳本。腳本地址爲 https://gist.github.com/litzi...
正常狀況下檢測成功的樣子是

clipboard.png

看到這個你就能夠放心的去debug了。

第二步

裝個瀏覽器插件,用戶請求監聽。這個東西惟一的做用就是方便了debug,正常若是不安裝的話你須要經過GET傳參 XDEBUG_SESSION_START=ID_KEY 才能夠,安裝插件後就不須要了。

clipboard.png

你能夠自行選擇是否開啓debug,如下爲瀏覽器插件列表

瀏覽器 下載
Chrome Xdebug Helper
Firefox The easiest Xdebug or Xdebug Helper
Safari Xdebug Toggler
Opera Xdebug launcher
Internet Explorer PhpStorm bookmarklets generator

第三步

開啓監聽便可。

clipboard.png

你能夠直接點擊圖片上的監聽按鈕。

到如今爲止,就配置好了IDE。

第四步

建立DEBUG配置文件,根據每一個項目都要配置。這步你跑不了。

clipboard.png

你看,PHPSTORM很是人性化,在每一步都會給你出個簡單的教程來描述如何配置DEBUG。

添加一個Server和IDE key(xdebug.idekey) 就能夠進行調試了。

總結

總結如下IDE配置DEBUG的步驟,實際很簡單。

  1. 下載安裝debug
  2. 驗證是否通訊正常
  3. 添加瀏覽器插件 (可省略)
  4. 配置運行文件
  5. 愉快的debug
這裏還要說明下,若是你是不須要訪問本機調試一些類或者代碼塊,你只須要在本機上安裝好XDEBUG,上述配置所有省略,直接點小蟲子圖標便可調試。DEBUG端口默認是9000,若是配置文件內修改了,固然在IDE內也須要修改下。

調試

介紹下實際DEBUG過程當中PHPSTORM面板的按鈕都是作什麼用的。當你啓動監聽後,你將會看到以下圖

clipboard.png

根據上圖圖標位置,以x,y座標的方式描述每一個圖標的功能。

圖標 位置 (x,y) 功能
clipboard.png 0,0 從新執行DEBUG (Rerun test.php)
clipboard.png 0,1 跳轉到原調試文件 (Show execution point)
clipboard.png 0,2 跳到下一行 (Step over)
clipboard.png 0,3 執行下一步 (Step info)
clipboard.png 0,4 跳入庫、構造函數等方法或類中 (Force Step Info)
clipboard.png 0,5 執行函數體或類方法,若是在最外層則結束本次調試 (Step out)
clipboard.png 0,6 跳到當前節點的下個斷點 (Run to Cursor)
clipboard.png 0,7 執行修改變量或返回的結果用於二次調試(Evaluate arbitrary expression)
clipboard.png 0,8 顯示值的地址 (Show Values Addresses)
clipboard.png 0,9 是否顯示空的值 , 默認是不顯示
clipboard.png 0,10 跳到下個斷點 (Add method to skip list)
clipboard.png 1,0 從新執行DEBUG (Resume Program)
clipboard.png 2,0 中止DEBUG(Step process)
clipboard.png 3,0 查看和管理全部的斷點 ( View and manage all breakpoints)
clipboard.png 4,0 忽略全部斷點 (Mute breakpoints)

其餘

Docker PHP XDEBUG

部分人在本機裝了Docker,容器中運行這PHP,這個時候該如何進行DEBUG呢?若是認真看本篇文章,你會發現十分的簡單。自己XDEBUG就是遠程調試。首先你要保證

  • 容器作了端口映射到本機80
  • 容器內項目目錄作了磁盤掛載

將容器PHP XDEBUG 中

xdebug.remote_host=local_ip

便可,也不用擔憂hosts文件的問題

本機IP = 127.0.0.1 = localhost

這樣配置完成後,就能夠當容器不存在,與本機調試同樣。

致謝

感謝你看到這裏,但願本章內容能夠幫到你,謝謝。

相關文章
相關標籤/搜索