PhpStorm Xdebug遠程調試環境搭建原理分析及問題排查

 2017年05月26日 
 經驗心得
php

做者:廖新喜html

原文地址:PhpStorm Xdebug遠程調試環境搭建原理分析及問題排查web

網上關於 phpstorm 調試的文章不少,真實實踐過的很少,都是幾篇文章轉來轉去,沒有原理分析,甚至有些文章的配置文件都是錯的,我就是按照一篇錯誤的配置一路走過來的,不過好歹把這些坑都給埋了,這篇文章不只僅有操做,還有原理分析,更有問題排查思路。apache

對於簡單的工程,直接print_r();exit()已經足夠,可是對於大型項目有時就有點力不從心,若是直接將 apache 部署在本地,phpstorm 調試本地代碼這種方式也能夠,我之前就是這麼幹的,這篇文章主要介紹遠程調試系問題排除。windows

一. 環境介紹

本地:windows7(192.168..)+ phpstorm8後端

遠程:Ubuntu14.04(192.168.3.206)+ apache2 + php5瀏覽器

二. 遠程環境配置

2.2 Xdebug安裝

Ubuntu下直接apt-get安裝,安裝命令以下:apt-get install php5-xdebug服務器

2.3 配置

首先經過locate定位到 xdebug.ini,這個位置必定得對,在 Ubuntu 上位於/etc/php5/apache2/conf.d/20-xdebug.inicookie

zend_extension=xdebug.so
xdebug.idekey=PHPSTORM
xdebug.remote_connect_back = 1
;//若是開啓此,將忽略下面的 xdebug.remote_host 的參數

;xdebug.remote_host=192.168.x.x
; //注意這裏是,客戶端的ip<即IDE的機器的ip,不是你的web server>

xdebug.remote_enable=on
xdebug.remote_port = 9001
;//注意這裏是,客戶端的端口<即IDE的機器的ip,不是你的web server>

xdebug.remote_handler = dbgp
xdebug.auto_trace = 1
xdebug.remote_log = /tmp/xdebug.log

三. 本地phpstorm配置

下面的配置有執行順序要求,請一步一步來。網絡

3.1 下載遠程代碼

phpstorm在新建項目的時候提供了選項,能夠經過ftp/sftp遠程下載代碼,直接按照提示下一步下一步就能夠。

3.2 添加php解釋器

經過file->settings->Languages & Frameworks找到php欄。

3.3 配置Debug

路徑仍是在file->settings->Languages & Frameworks->PHP,選擇Debug,選擇要監聽的端口,這裏設置爲9001,如圖所示:

設置完端口還須要設置DBGp Proxy,配置以下:

在設置完Debug頁面後,在DBGp Proxy頁面的端口已經肯定,添加上IDE key爲剛纔Xdebug配置文件設置的key:PHPSTORM,Host則爲要調試的遠程主機。

3.4 配置Server

經過file->settings->Languages Frameworks->PHP找到Servers,Host對應遠程主機IP, Debugger 選用 Xdebug ,若是是遠程調試,必定得開啓路徑映射功能,不然沒法調試,本地的路徑不用選,在新建遠程項目的時候就已經肯定,Absolute path on the server 則是遠程主機的 Web 路徑。在途中紅框上方有一個 Validate remote environment 能夠用來驗證遠程的 Xdebug 配置,若是配置明顯不對的話,會有提示信息,可按照提示信息修改遠程服務器的 Xdebug 配置。

3.5 配置調試選項

因爲調試的目標是一個項目,因此這裏須要設置PHP Web Application,配置中Server:遠程目標主機,Start URL設爲/,設置完以後會在左側新建一個PHP Web Application

到目前爲止,該配置的都已經配置完成,這裏面配置的選項比較多,一步一步配置,有順序要求。配置完以後就是調試。點擊下圖右邊紅框中的小按鈕,打開 Xdebug 監聽,再選擇咱們要調試的目標,這裏是server,最後點擊那個調試按鈕,就能開啓調試之旅。

打開 Xdebug 監聽的時候,能夠看到IDE已經在本地創建監聽服務,具體以下:

能夠看到調試頁面。以下所示

3.6 瀏覽器添加書籤或者Xdebug Helper

前面描述的是經過PHPStorm的 debug 按鈕,發送相似?XDEBUG_SESSION_START=17212這種請求調起瀏覽器來達到調試的目的,可是這種方式只能調起首頁,存在缺陷。下面介紹另一種啓動調試的方式,就是經過瀏覽器中帶XDEBUG_SESSION 的cookie直接發起,能夠安裝Chrome插件Xdebug Helper或者添加瀏覽器的調試插件、或書籤來達到目的。新建書籤的url:https://www.jetbrains.com/phpstorm/marklets/ , 這裏就再也不作示例,插件和書籤的原理都是同樣的,都是在cookie中添加XDEBUG_SESSION=PHPSTORM。

四. 數據流程

前面的配置徹底是一個操做指南,若是僅僅是爲了配置,上面的內容已經足夠,可是若是配置中遇到什麼問題,就須要接下來的原理分析。古人說的好,咱們得知其然還得知其因此然。

4.1 Xdebug工做原理
  1. IDE(如PhpStorm)已經集成了一個遵循BGDP的Xdebug插件,當開啓它的時候, 會在本地開一個Xdebug調試服務,監聽在調試器中所設置的端口上,默認是9000,這個服務就會監聽全部到9000端口的連接。在PhpStorm中,位於:工具欄 > Run > Start / Stop Listening for PHP Xdebug Connetions。

  2. 當瀏覽器發送一個帶 XDEBUG_SESSION_START 的參數的請求到服務器時,服務器接受後將其轉到後端的php處理,若是php開啓了xdebug模塊,則會將debug信息轉發到客戶端IP的IDE的調試端口上。當參數或者cookie信息中不帶 XDEBUG_SESSION_START ,則不會啓動調試。這就爲後續在瀏覽器中添加開關提供了可能。Xdebug的官方給出了一個示例圖:很好的展現了相互調用關係。 這個示例圖是綁定了ip,即便用了固定ip地址,xdebug.remote_connect_back = 0 ,也是 Xdebug 的默認方式,這種狀況下,Xdebug 在收到調試通知時會讀取配置 xdebug.remote_host 和 xdebug.remote_port ,默認是 localhost:9000,而後向這個端口發送通知,這種方式只適合單一客戶端開發調試。另一種方式則是不綁定IP,Xdebug根據請求來源(REMOTE_HOST)來發起調試。示例圖以下:

那從用戶發起請求到,到IDE的整個流程圖以下:

當用戶的請求參數或者cookie中不帶調試信息,數據流就是瀏覽器到Apache(或其餘web容器)到PHP,若是加上了調試參數,則請求還會由PHP轉給Xdebug處理,Xdebug再把信息轉發給IDE,完成調試功能。

五. 問題分析

因爲拷貝了錯誤的Xdebug參數,致使走了很多彎路,若是僅僅是爲了配置PhpStorm及Xdebug原理,關注前面部分便可。下面主要分析排除過程。

錯誤的配置以下:

zend_extension=xdebug.so
xdebug.idekey=PHPSTORM

#xdebug.remote_connect_back = 1 //若是開啓此,將忽略下面的 xdebug.remote_host 的參數

xdebug.remote_host=192.168.x.x //注意這裏是,客戶端的ip<即IDE的機器的ip,不是你的web server>

xdebug.remote_enable=on
xdebug.remote_port = 9001 //注意這裏是,客戶端的端口<即IDE的機器的ip,不是你的web server>

xdebug.remote_handler = dbgp
xdebug.auto_trace = 1
xdebug.collect_includes = 1
xdebug.collect_params = 1
;xdebug.collect_return = 1

xdebug.remote_autostart = 1

xdebug.remote_log = /tmp/xdebug.log

問題現象: Apache反應奇慢無比,一個普通請求能耗時10分鐘,可是最終會有效應。

排查過程:

5.1 問題背景

本地環境:Windows7,遠程服務器:Ubuntu14.04,這個遠程服務器是本地環境下VMWare WorkStation下的一臺虛擬機,網絡鏈接方式是橋接。在調試遠程項目時,做者使用的sftp來管理服務器的資源,這裏面就會涉及到權限的問題。遠程服務器只開了一個普通帳戶liaoxinxi,而/var/www 目錄之前是root權限的,因爲PhpStorm調試時會在遠程服務器web目錄下建立一個文件,這必然會致使權限問題,爲了解決這個問題,執行chmod liaoxinxi:liaoxinxi /var/www -R將web目錄修改成liaoxinxi用戶全部。固然爲了遠程調試,我配置了xdebug.ini,這個配置參數當時也不是太清楚具體含義,比較着急,就從某篇號稱親手測試過可用的Xdebug環境拷貝而來。下午比較混沌,當時作過的操做還挺多,Xdebug這個配置我竟然忘記我配過了,只記得修改了權限相關內容。重啓Apache以後,web請求響應奇慢無比。

5.2 疑問點

5.2.1 權限

當時一股腦的認爲是權限的問題,就又把web目錄權限全改成777,仍是奇慢無比,查看apache日誌也沒有半點異常。

5.2.2 網絡

無心之中發如今遠程服務器上直接訪問,很快就能獲得響應。這個遠程服務器是我VMware下的虛擬機,經過橋接模式與宿主機通訊。中午與其餘同事討論這個問題的時候將問題排查點轉移到網絡環境。懷疑是網絡的問題,將橋接模式改爲NAT,又是重啓虛擬機,重啓宿主機,都不起做用。

5.2.3 Apache配置

因而又將矛盾轉移到Apache的配置上,Apache的配置文件被我改動了不少回,當時以爲很簡單因此沒設置備份點,一個好的備份是多麼重要。只能重裝,這個在Ubuntu下仍是很簡單的,一條命令搞定apt-get auto-remove --purge apache2,而且刪除了原有的配置文件。再經過apt-get從新安裝,apt-get install apache2,重啓apache後發如今本地訪問,很快獲得響應,不過響應的都是原始的php文件,再安裝一下libapache2php模塊,安裝完以後,響應仍是同樣的奇慢無比。難道跟這個模塊有關係,可是找不到相關資料。再翻看安裝apache2的輸出信息時發現其重啓了Xdebug模塊,回想一下,是否是這些模塊致使的問題呢?再仔細想一想,那天下午好像還改了Xdebug的配置,可能有問題。

5.2.4 Xdebug配置

回到Xdebug的配置文件,其中一個配置xdebug.remote_host=192.168.*.* //這個配置是用來,感受峯迴路轉了,由於只有這個ip訪問就會奇慢無比,因而註釋掉,再重啓apache訪問,果真奇慢無比的問題解決了。

可是這又帶來一個新的問題,這個ip是個人本地環境,若是不配置的話怎麼調試呢?因而將//後邊的內容用;註釋起來,前期一直覺得//也是個註釋。//這種註釋方式在Xdebug中不識別,因此根本不會向IDE所在機器發送調試包,會一直等到超時,因此就會特別慢。 再去調試,在index.php下斷點,終於斷下來了。調試的過程當中發現,開啓或者未開啓調試參數都會直接進入調試模式,見了鬼了,回想起調試流程圖,確定出問題的地方在Xdebug的配置,打開配置文件,果真發現一個相關參數xdebug.remote_autostart = 1,這個參數的意思就是自動打開遠程調試,註釋掉就能接收不使用Xdebug調試的參數。

說到最後不得不佩服這位兄弟,挖了兩個大大的坑(坑的位置),好歹我全埋了,提醒你們儘可能找官方文檔,若是官方文檔寫的不詳細的,仍是多見識見識幾份文檔。

綜合來看,信息大爆炸的年代,干擾信息太多,各位見仁見智。

相關文章
相關標籤/搜索