> 工欲善其事必先利其器,學習一門新語言,調試器的使用必不可少,本文分享一下PHP調試器的使用。php
PHP目前有兩種流行的調試器,chrome
我在學習和研究過程當中,發現網上的各類信息過於凌亂,感到痛苦,影響理解和使用。今天我以Xdebug爲例,先解釋其基本的工做原理,再說明生產過程當中如何使用,但願能帶給你們清晰易懂的知識。shell
Xdebug是一個PHP擴展,它採用DBGp協議,提供了對PHP進行Debugging和Profiling的能力。瀏覽器
Debug信息包含:session
stack and function traces in error messages with:ide
此外,Xdebug還提供如下功能:php-fpm
今天只討論Debug,其它功能之後有機會再分享。post
原文參考:https://xdebug.org/docs/remote單元測試
簡單來講,XDebug調試是一種C/S結構,Client是PHP-Xdebug插件,Server是咱們的IDE(或者各類Editor插件),中間經過DBGp協議通訊。PHP腳本在運行時,由Xdebug插件向IDE發起鏈接,將調試信息發送給IDE,並經過DBGp協議進行互動。學習
看下圖,就明白了:
以上是單人模式,在php.ini中配置了IDE的IP地址以及監聽的端口。這種模式的缺陷是配死了IDE目標,不能支持多用戶調試。因此Xdebug還提供了一種多用戶的調試模式,這種模式無需配置remote_host,而是配置xdebug.remote_connect_back=On,Xdebug會記下來訪地址,做爲調試時的鏈接目標。調試過程以下:
搞明白了原理,那咱們就開始實踐吧。
根據各自不一樣的工做站平臺,參考官方安裝指導.
安裝的時候注意一下輸出信息,記下安裝好的擴展包位置,下一步配置PHP時會用到。
打開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,表示打開遠程調試開關,這是必須的。
而後,有兩種方法能夠驗證一下插件是否加載成功:
命令行執行php -v,看看
![pic](http://imgur.com/3UbEnNo.png)
網頁輸出phpinfo()
![pic](http://imgur.com/r3I8FZF.png)
以上輸出若能看到Xdebug版本信息,就ok了。另外,在phpinfo中,能夠看到xdebug的配置信息,搜搜看,這些配置都是能夠在php.ini中進行修改的,各自表明的意思你們能夠查官網,這裏就不詳述了。
以PHPStorm爲例,PHPStorm實現了DBGp協議,咱們須要配置它監聽的端口,這個端口號須要與xdebug.remote_port一致,才能確保調試時PHP-Xdebug能連上IDE。
如下是默認配置,若是沒有衝突能夠不用改。在幫其餘同窗trouble shooting時,發現php-fpm和xdebug默認都使用9000號端口,真是一個奇怪的配置啊,難道他們倆不該該常常被同時使用嗎?若是你發現本身的debug不能正常工做,不妨檢查一下這一點,將他們調整爲不一樣的端口。
以前說過,IDE是做爲一個Server的角色監聽特定端口,等待Xdebug來鏈接,對於PHPStorm開啓監聽很是簡單,直接點擊右上角的「小電話」按鈕:
變成
而後在代碼裏面打下斷點。
接下來,開始運行並調試代碼。針對不一樣類型的應用,方法也不同。但目的都是相同的,就是要告訴PHP-Xdebug,我要開始調試了,給我把調試信息發過來!
兩種方法:
其實IDE提供了快捷的操做方式,不用你手動寫URL參數。見Debugging PHP Web Applications with Run Debug Configurations,簡單來講,就是你須要配置好Web Server,PHP Web Application,再點擊後上角的「小瓢蟲」按鈕,IDE就會自動打開瀏覽器,幫你輸好網址,並添加QueryString:XDEBUG_SESSION_START=session_name。
安裝瀏覽器插件,插件會在你請求一個PHP頁面時,帶上一個XDEBUG_SESSION Cookie,這樣就不用在URL上帶參數了。
支持的插件:
試試以上兩種方法,斷點命中!開始享受調試。
通常用在命令行程序或者單元測試的調試中。
咱們須要經過設置環境變量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