PHP xdebug 調試工具安裝與使用

> 工欲善其事必先利其器,學習一門新語言,調試器的使用必不可少,本文分享一下PHP調試器的使用。php

PHP目前有兩種流行的調試器,chrome

我在學習和研究過程當中,發現網上的各類信息過於凌亂,感到痛苦,影響理解和使用。今天我以Xdebug爲例,先解釋其基本的工做原理,再說明生產過程當中如何使用,但願能帶給你們清晰易懂的知識。shell

Xdebug

Xdebug是一個PHP擴展,它採用DBGp協議,提供了對PHP進行Debugging和Profiling的能力。瀏覽器

Debug信息包含:session

  • stack and function traces in error messages with:ide

    1. full parameter display for user defined functions
    2. function name, file name and line indications
    3. support for member functions
  • memory allocation
  • protection for infinite recursions

此外,Xdebug還提供如下功能:php-fpm

  • profiling information for PHP scripts
  • code coverage analysis
  • capabilities to debug your scripts interactively with a debugger front-end

今天只討論Debug,其它功能之後有機會再分享。post

Debug原理

原文參考:https://xdebug.org/docs/remote單元測試

簡單來講,XDebug調試是一種C/S結構,Client是PHP-Xdebug插件,Server是咱們的IDE(或者各類Editor插件),中間經過DBGp協議通訊。PHP腳本在運行時,由Xdebug插件向IDE發起鏈接,將調試信息發送給IDE,並經過DBGp協議進行互動。學習

看下圖,就明白了:

xdebug運行結構

  • The IP of the server is 10.0.1.2 with HTTP on port 80
  • The IDE is on IP 10.0.1.42, so xdebug.remote_host is set to 10.0.1.42
  • The IDE listens on port 9000, so xdebug.remote_port is set to 9000
  • The HTTP request is started on the machine running the IDE
  • Xdebug connects to 10.0.1.42:9000
  • Debugging runs, HTTP Response provided

以上是單人模式,在php.ini中配置了IDE的IP地址以及監聽的端口。這種模式的缺陷是配死了IDE目標,不能支持多用戶調試。因此Xdebug還提供了一種多用戶的調試模式,這種模式無需配置remote_host,而是配置xdebug.remote_connect_back=On,Xdebug會記下來訪地址,做爲調試時的鏈接目標。調試過程以下:

xdebug運行結構

  • The IP of the server is 10.0.1.2 with HTTP on port 80
  • The IDE is on an unknown IP, so xdebug.remote_connect_back is set to 1
  • The IDE listens on port 9000, so xdebug.remote_port is set to 9000
  • The HTTP request is made, Xdebug detects the IP addres from the HTTP headers
  • Xdebug connects to the detected IP (10.0.1.42) on port 9000
  • Debugging runs, HTTP Response provided

搞明白了原理,那咱們就開始實踐吧。

安裝Xdebug

根據各自不一樣的工做站平臺,參考官方安裝指導.

安裝的時候注意一下輸出信息,記下安裝好的擴展包位置,下一步配置PHP時會用到。

配置PHP-Xdebug

打開php.ini(不知道php.ini在哪裏的,能夠輸出phpinfo()看看),而後加上對Xdebug擴展的配置:

[Xdebug]
zend_extension="/usr/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so"
xdebug.remote_enable=On

xdebug.remote_enable=On,表示打開遠程調試開關,這是必須的。

而後,有兩種方法能夠驗證一下插件是否加載成功:

  1. 命令行執行php -v,看看

    ![pic](http://imgur.com/3UbEnNo.png)
  2. 網頁輸出phpinfo()

    ![pic](http://imgur.com/r3I8FZF.png)

    以上輸出若能看到Xdebug版本信息,就ok了。另外,在phpinfo中,能夠看到xdebug的配置信息,搜搜看,這些配置都是能夠在php.ini中進行修改的,各自表明的意思你們能夠查官網,這裏就不詳述了。

phpinfo

配置IDE

以PHPStorm爲例,PHPStorm實現了DBGp協議,咱們須要配置它監聽的端口,這個端口號須要與xdebug.remote_port一致,才能確保調試時PHP-Xdebug能連上IDE。

如下是默認配置,若是沒有衝突能夠不用改。在幫其餘同窗trouble shooting時,發現php-fpm和xdebug默認都使用9000號端口,真是一個奇怪的配置啊,難道他們倆不該該常常被同時使用嗎?若是你發現本身的debug不能正常工做,不妨檢查一下這一點,將他們調整爲不一樣的端口。

pic

開始Debug

以前說過,IDE是做爲一個Server的角色監聽特定端口,等待Xdebug來鏈接,對於PHPStorm開啓監聽很是簡單,直接點擊右上角的「小電話」按鈕:

pic

變成

pic

而後在代碼裏面打下斷點。

接下來,開始運行並調試代碼。針對不一樣類型的應用,方法也不同。但目的都是相同的,就是要告訴PHP-Xdebug,我要開始調試了,給我把調試信息發過來!

Web App

兩種方法:

  1. 在請求的URL地址後面加一個QueryString:XDEBUG_SESSION_START=session_name(固然用POST參數也能夠),這樣PHP-Xdebug就會知道該鏈接IDE調試了。

    其實IDE提供了快捷的操做方式,不用你手動寫URL參數。見Debugging PHP Web Applications with Run Debug Configurations,簡單來講,就是你須要配置好Web Server,PHP Web Application,再點擊後上角的「小瓢蟲」按鈕,IDE就會自動打開瀏覽器,幫你輸好網址,並添加QueryString:XDEBUG_SESSION_START=session_name。

  2. 安裝瀏覽器插件,插件會在你請求一個PHP頁面時,帶上一個XDEBUG_SESSION Cookie,這樣就不用在URL上帶參數了。

    支持的插件:

試試以上兩種方法,斷點命中!開始享受調試。

Console

通常用在命令行程序或者單元測試的調試中。

咱們須要經過設置環境變量XDEBUG_CONFIG來通知Xdebug進行調試。固然,咱們能夠向這個環境變量中添加更多的設置來配置Xdebug(這些配置均可以在php.ini中進行設置)。

export XDEBUG_CONFIG="idekey=session_name"
php myscript.php

斷點命中!

不想調試了,釋放掉這個環境變量。

unset XDEBUG_CONFIG

小技巧,若是你用Zsh,能夠爲上述兩段小代碼設置別名。

alias xdebug-on="export XDEBUG_CONFIG=\"idekey=PHPSTORM\""
alias xdebug-off="unset XDEBUG_CONFIG"

PHPStorm也提供了快捷的操做,見Debugging PHP CLI scripts with PhpStorm

相關文章
相關標籤/搜索