對於PHP開發,初來咋到,開發環境的搭建和理解感覺是最煩人的一件事了。不像JAVA,打開一個Eclipse就可以開搞,Php的Debug都要幾個插件來配合工作。這些都是死的,好說。但是對於Xdebug的工作原理我一直是耿耿於懷,后來看了一篇神文Xdebug斷點調試的工作原理詳解。
Xdebug的工作原理可以總結為下面幾個步驟
1)IDE(比如PhpStorm,下文所述的客戶端)中已經集成了一個遵循BGDp協議(一個專門用來調試的協議)的Xdebug插件。當要debug的時候,點擊一些IDE的某個按鈕,啟動這個插件。該插件會啟動一個9000的端口監聽遠程服務器發過來的debug信息。
2)瀏覽器向Httpd服務器發送一個帶有XDEBUG_SESSION_START
參數的請求,Httpd收到這個請求之后交給后端的PHP進行處理(下面就忽略Httpd,直接把Php叫做Server)。
3)Php看到這個請求是帶了XDEBUG_SESSION_START
參數,就告訴Xdebug,“嘿,我要debug喔,你准備一下”。這時,Xdebug這時會向來源ip客戶端的9000端口(即客戶端,也即是IDE)發送一個debug請求,然后客戶端的9000端口響應這個請求,那么debug就開始了。
4)Php知道Xdebug已經准備好了,那么就開始開始一行一行的執行代碼,但是每執行一行都會讓Xdebug過濾一下。
5)Xdebug開始過濾代碼,Xdebug在過濾每一行代碼的時候,都會暫停代碼的執行,然后向客戶端的9000端口發送該行代碼的執行情況,等待客戶端的決策(是一句代碼還是下一個斷點待)。
6)相應,客戶端(IDE)收到Xdebug發送過來的執行情況,就可以把這些信息展示給開發者看了,包括一些變量的值等。同時向Xdebug發送下一步應該什么。
1下載對應版本的xdebug
xdebug官網下載地址:https://xdebug.org/download.php
你需要仔細分析和選擇要下載的對應版本,否則無法調試。由於非常容易出錯,建議采用下面這種簡單方法:
xdebug網站提供一個自動分析你系統對應的xdebug版本的頁面,網址是 https://xdebug.org/wizard.php
圖1-1 xdebug網站提供的一個自動分析系統對應xdebug版本的頁面
在頁面中需要粘貼進去php版本信息,也就是phpinfo()函數的信息,如下圖:
圖1-2 phpinfo();函數返回的信息
ctrl+A全選這個頁面的信息,然后粘貼到第一個圖片的頁面中。
不知道這個頁面如何出現的同學在你的php服務器程序目錄下 創建一個phpinfo.php文件,只需一行代碼
<?php phpinfo(); ?>
瀏覽器中輸入 http://127.0.0.1/phpinfo.php 就出現圖2 中的頁面了。
圖1-3 向頁面中拷貝phpinfo()獲取的信息
點擊 analyse my phpinfo() output 按鈕
圖1-4 找到你需要下載的xdebug版本
圖1-5 下載后拷貝到指定目錄,並在對應的php.ini中末尾處添加圖中第3小點的內容
到此為止,xdebug的下載和啟用就完成了,重新運行 phpinfo.php 文件,在打開的頁面中出現圖1-6則說明安裝正確:
注意問題
1phpinfo.php需要啟動服務器后,通過瀏覽器訪問。
2 php.ini文件中增加的行,等號前后有空格,字符串值可以有引號也可以沒有引號。
zend_extension = C:\laragon\bin\php\php-7.1.7-Win32-VC14-x64\ext\php_xdebug-2.6.0-7.1-vc14-x86_64.dll
zend_extension = "C:\laragon\bin\php\php-7.1.7-Win32-VC14-x64\ext\php_xdebug-2.6.0-7.1-vc14-x86_64.dll"
(這是我本機地址,這里建議直接拷貝圖1-5中網頁給出的值)
2phpstorm中使用xdebug
2.1修改php配置文件
1 php服務器在本地的情況。
在php.ini文件的末尾處追加如下代碼:
;xdebug庫文件 zend_extension = "C:\laragon\bin\php\php-7.1.7-Win32-VC14-x64\ext\php_xdebug-2.6.0-7.1-vc14-x86_64.dll" ;開啟遠程調試 xdebug.remote_enable = On ;客戶機ip xdebug.remote_host="127.0.0.1" ;客戶機xdebug監聽端口和調試協議 xdebug.remote_port=9001 xdebug.remote_handler=dbgp ;idekey 區分大小寫 xdebug.idekey="PHPSTORM" xdebug.profiler_enable = off xdebug.profiler_enable_trigger = off xdebug.profiler_output_name = cachegrind.out.%t.%p ;idekey 區分大小寫 xdebug.profiler_output_dir = "d:\tmp"
圖2-1圖中標紅的地方因不同主機而不同,請注意
2 PHP服務器不是本機
這種情況我還沒有試過,以后再補充,大家有做過的可以給我留言。
2.2 phpstorm中的配置





3調試使用
(1)新建一個運行調試配置
圖3-1創建一個調試配置
點擊“+”,創建一個 PHP Web Application的配置,右側輸入一個用於記憶的名稱,選擇服務器
(2)打開IDE的debug監聽
圖3-2 圖中為關閉狀態,單擊后為打開狀態
(3)開始調試
圖3-3 斷點生效
紅色圓中有個對號,是說明改斷點生效了
幾點注意
(1)Apache服務器默認的端口是80,按照上面設置就可以了,Nginx默認是8080有URL的地方需要調整一下。URL的組成結構中包括端口號,只是默認值是80,很多時候省略了。
(2)遇到問題仔細分析一下,都是可以解決的,如果實在有困難,可以在評論區留言。
4調試的意義
5參考資料
1 phpStorm+XDebug進行斷點調試的配置
http://www.chenxuanyi.cn/xampp-phpstorm-xdebug.html
2利用下面網頁中的Start debug按鈕在COOKIE中設置Xdebug所需的變量。
http://www.jetbrains.com/phpstorm/marklets/
3 Cannot accept external Xdebug connection:Cannot evaluate expression 'isset($_SERVER['PHP_IDE_CONFIG'])
http://devnet.jetbrains.com/message/5463083?tstart=0
4Xdebug調試原理