PHP 規範開發(一):斷點調試

調試原理

參見:官方文檔php

調試流程

1  - Browser        使用 HTTP 向 Server 的 80 端口發送請求
2  - Nginx          監聽到 80 端口的調試請求
3  - Nginx          將請求流轉到 PHP
4  - PHP            將調試請求轉發給 Xdebug
5  - Xdebug         向 Client 的 9000 端口響應請求(Xdebug 讀取配置信息肯定響應的端口)
6  - Phpsstorm      監聽 9000 端口的響應(故 Client 監聽端口要與 Xdebug 的配置一致)
7  - Phpsstorm      確認要斷點調試到的位置,響應給 Xdebug
8  - Xdebug         通知 PHP 執行到斷點位置
9  - PHP            將執行後的信息流轉給 Nginx
10 - Nginx          將信息響應給 Browser
11 - Browser        顯示執行結果

官方文檔裏的流程圖
圖片描述html

選擇版本

手動選擇

Xdebug下載頁面web

這裏介紹 Windows 的 Xdebug 安裝
source (SHA256: dae691d6c052073b886e0c6e1306a707bca9fd18a1e3485384ef6c4aacf1bd77)
Windows binaries:
PHP 7.0 VC14    (64 bit) (SHA256: a7b7ebcaaabb6840751c83411fb3e787d04be6e75e95df96b3ba88a581215b2d)
PHP 7.0 VC14    (32 bit) (SHA256: b108c1e09fce65fdeafa79687ba3ce4e08d7e6861cac6b90e5546d46ab250a45)
PHP 7.0 VC14 TS (64 bit) (SHA256: 4d61ffb7d4b8def2f1f8f9f08695048fc03844477719939f712f8ba53f646712)
PHP 7.0 VC14 TS (32 bit) (SHA256: 7812579264b3eae5668b05024997f7b7fce5d6abf00a3b019563c7f779697dff)
PHP 7.1 VC14    (64 bit) (SHA256: 8e4d46c322fab7a40362730647010f3cb52027a05bb70da3d1a3a08436c96a22)
PHP 7.1 VC14    (32 bit) (SHA256: d1c14fc4227166de4834db102677da875c039e50a197654d304d6a407bdcca4f)
PHP 7.1 VC14 TS (64 bit) (SHA256: b2adba0a07ae3d6038d25c50a85484b98bae95df3c533d5f2607484d91b12e03)
PHP 7.1 VC14 TS (32 bit) (SHA256: 8c0cfa8cb74695361f0230b1d6bef4bbba01c089c17efcb4d108d7beba7462e1)
PHP 7.2 VC15    (64 bit) (SHA256: d589baece219d3bc3963dcdd9fc475294767328b0d2552cec7e2363146870dae)
PHP 7.2 VC15    (32 bit) (SHA256: dd5872cf7bb5fabeb3c8c7e77a8bb2cef314705147a40decacd772c6f840b778)
PHP 7.2 VC15 TS (64 bit) (SHA256: ae18f7659f55e7bfcf42c782d1cfa11373524630c182de5b882f9e37e8791385)
PHP 7.2 VC15 TS (32 bit) (SHA256: ddedf1d0cea0e9fd36c49ba01c6afbea60d1299b3f86bba9cdf057b53ce2bee5)

根據 phpinfo 給出的信息選取 「32 bit 或 64 bit」 以及「TS 或 NTS」vim

System                     Linux centos7 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64
...
PHP Extension Build        API20160303,NTS

這裏須要注意的是: Windows 環境下使用 PHPStudy 的系統版本都是 32 bitsegmentfault

System                     Windows NT SEA 10.0 build 16299 (Windows 10) i586  
...
Architecture               x86  
...
PHP Extension Build        API20151012,NTS,VC14
  • 添加 Xdebug 擴展

編輯 php.inicentos

[XDebug]

zend_extension = "D:\EXE\phpStudy\php\php-7.0.12-nts\ext\php_xdebug.dll"
  • Windows 本地下載 PHP 7.0 VC14 (32 bit)dll 文件放入對應版本 phpext 拓展文件夾內便可

自動選擇

這裏介紹 Linux 的 Xdebug 安裝

在官方自動選擇 Xdebug 界面輸入 phpinfo() 輸出的信息,會給出適合當前 php 的 Xdebug 版本設計模式

圖片描述

根據官方提示進行安裝便可服務器

[root@localhost ~]# wget http://pecl.php.net/get/xdebug-2.6.1.tgz
    [root@localhost ~]# tar -xvzf xdebug-2.6.1.tgz
    [root@localhost ~]# phpize
    [root@localhost ~]# ./configure --with-php-config=/usr/local/php/bin/php-config
    [root@localhost ~]# make && make install
    [root@localhost ~]# vim /usr/local/php/etc/php.ini

添加 Xdebug 拓展cookie

# zend_extension = xdebug.so

配置設置

監聽端口

  • 配置監聽端口

圖片描述

端口衝突

針對的是: Windowssession

# 查看端口狀態
netstat -ano

#查看指定端口狀態
netstat -ano | findstr 9000

# TCP    127.0.0.1:9000         0.0.0.0:0              LISTENING       4144
# TCP    127.0.0.1:9000         0.0.0.0:0              LISTENING       5268
# TCP    127.0.0.1:9000         0.0.0.0:0              LISTENING       4300
# TCP    127.0.0.1:9000         0.0.0.0:0              LISTENING       5476

#找到進程號對應的進程名稱
tasklist | findstr 4144

#根據進程名稱終止進程
taskkill /f /t /im /php-cgi.exe

#也能夠直接去任務管理器根據PID終止進程

配置說明

[xdebug]
zend_extension="D:\EXE\phpStudy\php\php-7.0.12-nts\ext\php_xdebug.dll"   # 引入Xdebug拓展
xdebug.auto_trace= On                                                    # 是否開啓自動跟蹤
xdebug.show_exception_trace= On                                          # 是否開啓異常跟蹤
xdebug.remote_autostart= On                                              # 是否開啓遠程調試自動啓動
xdebug.remote_enable = On                                                # 是否開啓遠程調試
xdebug_remote_host = "127.0.0.1"                                         # 配置遠程調試主機IP
xdebug.extended_info=On                                                  # 是否開啓調試擴展信息
xdebug.profiler_enable = On                                              # 是否開啓調試內容
xdebug.profiler_output_dir = "c:/wamp/tmp"                               # 調試輸出路徑
xdebug.remote_handler = dbgp                                             # 多人調試指定dbgp代理
xdebug.remote_port = 9001                                                # 遠程調試的端口
xdebug.idekey = phpStorm                                                 # 多人調試模式在代理服務器標識IDE
xdebug.collect_vars= On                                                  # 是否收集變量
xdebug.collect_return= On                                                # 是否收集返回值
xdebug.collect_params= On                                                # 是否收集參數
xdebug.trace_output_dir="c:/wamp/tmp"                                    # 跟蹤輸出路徑

斷點調試

開啓調試

  • 開啓調試的兩種方法
1. 開啓監聽調試請求的按鈕,監聽到具備「XDEBUG_SESSION」的變進入調試狀態

2. 開啓配置好的配置信息,監聽符合配置設置要求的調試請求
  • 設置調試配置
1. [PHP Web Page]    :不須要設置「IDE Key」每次調試都會自動生成「XDEBUG_SESSION_STAR」及其的隨機數值

2. [PHP Remote Debug]:配置了「IDE Key」調試時經過「IDE Key」來鑑定身份判斷是否開啓調試
  • 鏈接調試器

要開始調試,首先須要在服務器上激活調試器。

If you want to debug a script started through a web browser, simply add XDEBUG_SESSION_START=session_name as parameter to the URL. Instead of using a GET parameter, you can also set XDEBUG_SESSION_START as a POST parameter, or through a cookie named XDEBUG_SESSION.

鏈接調試器有多種方式:

1. 「GET」   方式:在「URL」後追加「 XDEBUG_SESSION_START = session_name」
 2. 「POST」  方式:在「POST」請求中添加「XDEBUG_SESSION_START = session_name」參數
 3. 「COOKIE」方式:將「XDEBUG_SESSION = session_name」設爲「COOKIE」

 #   在開啓用監聽調試請求時鏈接調試器依據「XDEBUG_SESSION」是否存在,不關心其值

使用「Xdebug Helper」插件能夠很方便地實現設置「COOKIE」方式鏈接調試器

圖片描述

與監聽調試請求(Listening for PHP Debug Connections)不一樣,遠程調試(PHP Remote Debug)要求「XDEBUG_SESSION」的值與配置遠程調試(PHP Remote Debug)時設置的「IDE Key(session id)」一致

本地項目

即項目架設在本地,Xdebug 與 IDE 在同一個環境中

  • php.ini 文件中的 Xdebug 配置
[XDebug]
zend_extension        = "D:\EXE\phpStudy\php\php-7.0.12-nts\ext\php_xdebug.dll"
xdebug.remote_enable  = on
xdebug.remote_port    = 9001 
xdebug.remote_host    = 127.0.0.1
xdebug.remote_handler = dbgp
  • 在 PhpStorm 中配置服務器信息

圖片描述

遠程項目

即項目部署在遠程,Xdebug,PHP 在服務器上, IDE,Browser 在本地

  • 配置文件
[XDebug]
zend_extension        = xdebug.so
xdebug.remote_enable  = on
xdebug.remote_port    = 9001
xdebug.remote_host    = 192.168.1.4
xdebug.remote_handler = dbgp
配置要本地與遠程的代碼映射關係才能使本地打的斷點正確地在遠程執行

圖片描述

使用 Host: www.vmshop.com 才能讓 Nginx 解析到正確的項目根路徑.

多人調試

官方文檔裏的流程圖:

圖片描述


代理協議

因爲 Xdebug 的 xdebug.remote_host 限制了調試人數,下載 DBGp 代理實現多用戶調試

  • 配置文件
[XDebug]
zend_extension        = xdebug.so
xdebug.remote_enable  = on
xdebug.remote_port    = 9002
xdebug.remote_host    = 127.0.0.1
  • 運行 DBGp 代理
[root@centos7 ~]# ./pydbgpproxy -i 0.0.0.0:9001 -d 9002

# INFO: dbgp.proxy: starting proxy listeners.  appid: 24399
# INFO: dbgp.proxy: dbgp listener on 127.0.0.1:9002
# INFO: dbgp.proxy: IDE listener on  0.0.0.0:9001

# INFO: dbgp.proxy: Server:onConnect ('192.168.108.1', 9572) [proxyinit -p 9001 -k jiong -m 1]

關於: ImportError: No module named dbgp.serverBase 的解決方法

  • 註冊本機到 DBGp 代理服務

在 PhpStorm 的導航欄上找到 DBGp Proxy 進行 Register IDE 便可

# 註冊成功或失敗 IDE 的 Event Log 都會有相應的提示記錄

1:15    Xdebug proxy: IDE successfully registered with ide key 'jiong'

1:19    Xdebug proxy: IDE Key already exists

動態地址

[XDebug]
zend_extension             = xdebug.so
xdebug.remote_enable       = on
xdebug.remote_port         = 9001
xdebug.remote_connect_back = 1
xdebug.remote_handler      = dbgp

配置好路徑映射正確的「Servers」,開啓監聽調試便可

相關文章

PHP 規範開發(一):斷點調試
PHP 規範開發(二):單元測試
PHP 規範開發(三):版本控制與協做開發
PHP 規範開發(四):重構、代碼規範及設計模式

相關文章
相關標籤/搜索