為什麼
PHP程序報錯,肉眼review了多少遍都覺得自己的寫得沒問題;有個switch代碼分支判斷,為什麼進不了我想要的case; 調試PHP代碼還在用 var_dump($re); die();。試試Xdebug斷點調試吧。
他能做什麼
開啓Debug監聽,一步步順着代碼走進程序的最深處。你會了解到真實的代碼運行步驟,以及調用關係。你還能知道每個變量在程序運行時,值的多少,以及變化。同時避免了 var_dump 代碼植入,(如果忘了刪除,提交到線上,那這個恥辱柱會狠狠地釘在你身上)
好的來介紹下我們的這期主角 Xdebug
Xdebug 是
Xdebug是一個PHP擴展,提供了調試和性能分析功能。[1]它使用DBGp調試協議。
Xdebug可以提供的調試信息包括以下內容:
- 錯誤消息[2]中的堆棧和函數跟蹤具有:
- 用户定義功能的全參數顯示
- 函數名稱,文件名和行指示
- 支持成員功能
- 內存分配
- 保護無限遞歸
Xdebug還提供:
- PHP腳本的概要分析信息[3]
- 代碼覆蓋率分析
- 與調試器前端交互地調試腳本的功能。[4]
以上摘自wiki
開始動手
環境介紹
這篇文章主要圍繞Docker環境下PHP的Xdebug調試展開。
先説下筆者演示環境:Mac環境,安裝Virtual Box,跑了一個Ubuntu虛擬機,再裝了Docker ce軟件。看到這,大夥兒先別急着關網頁啊,我的環境估計有些奇葩,但大致流程是差不多的。
這套PHP Docker環境這篇文章有詳細介紹: [Docker快速搭建一套PHP、Nginx、MySQL、Redis、Xdebug、Memcached 開發環境
安裝軟件
為 PHP 安裝 Xdebug
Xdebug 官方文檔已介紹。
- Linux 或 Mac 環境通過命令行:
$ pecl install xdebug
- Windows 用户通過 Xdebug Download 頁面,根據自己的PHP版本可直接下載
*.dll放入到拓展目錄即可。
$ php -v // 查看 PHP 版本
- 手動編譯安裝
對於網絡不那麼暢通,pecl不能用時。
## 獲取源碼
$ git clone https://github.com/xdebug/xdebug.git
## 進入目錄
$ cd xdebug
## php檢查
$ phpize
## 編譯前配置,一般來説 phpize 已經準備好了大部分工作,以及配置
$ ./configure
## 編譯
$ make
## 測試並安裝
$ make test && make install
- Docker 環境為PHP安裝PHP拓展
Docker 環境下提供了兩種方式,第一種是通過pecl在線下載安裝,受限於網絡狀況,大概了下會失敗。
那麼可以嘗試通過其他途徑下載好pecl-Xdebug的壓縮包,Add到docker容器中安裝。
FROM php:7.3-fpm-buster
...
# 方法1 pecl 安裝
RUN yes | pecl install xdebug \
&& echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_autostart=off" >> /usr/local/etc/php/conf.d/xdebug.ini
## ------------------------------------------------
# 方法2 下載安裝 xdebug
ADD ./xdebug-2.6.1.tgz /tmp/php7-xdebug
RUN cd /tmp/php7-xdebug/xdebug-2.6.1/ && phpize && ./configure && \
make && make install
配置 xdebug
找到我們的配置文件.
## 文件: /etc/php/conf.d/xdebug.ini
zend_extension=xdebug.so // 啓用xdebug拓展!
xdebug.remote_connect_back=1
xdebug.remote_enable = 1 // 啓用遠程調試
xdebug.remote_mode = "req"
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "10.0.2.2" // 這是你PHPStorm運行環境的IP地址
xdebug.remote_port = 9000 // 默認9000,最好別動
xdebug.idekey="PHPSTORM" // PHPStormIDE用的默認值
xdebug.remote_autostart = 1
關於這個 xdebug.remote_host 這個ip,不是想當然就填個 127.0.0.1, 你要看看你PHPStorm所運行的環境,和PHP運行環境是否在一個環境,如果是,你填 127.0.0.1 是沒問題。是Docker那麼就肯定不在一個環境了,怎麼看我們IDE所處環境的IP呢,先編輯下入口文件 index.php, 獲取SERVER變量的 REMOTE_ADDR 屬性。
## 文件: ~/public/index.php
<?php
print_r($_SERVER['REMOTE_ADDR']);die();
打開瀏覽器訪問下php-fpm服務。這裏是多少,xdebug.remote_host 就填多少。
配置 Docker
Docker環境下,要用IDE去debug代碼,IDE還需要和Docker打交道。就是在PHPStorm配置好Dcoker的API入口。
這個大家可以參考這片文章 Docker開啓Remote API 訪問 2375端口 來配置下Docker環境。
轉載註明出處
配置 phpstorm
以上準備好了後,就開始我們的重頭戲,配置PHPStorm.
1.將Docker Remote API配置在PHPStorm上.
由於我的環境裝了Vbox,用了NAT,所以端口是42376,你要自己的環境配置為準。
下面的 Connection Successful 就表示配置成功了。這裏的 Name: 名字要記下來,後面要用。
2.新增PHP Cli Interpreter.
搜索: php language,點擊最右側 ··· 按鈕
選擇 From Dcoker...
這裏的 Server: 名字選擇 第 1 步 的 Dcoker Server 的名字。 Image name: 選擇你的php容器。
點擊確認後,PHPStorm會檢查 PHP容器的版本,Xdebug拓展是否啓用。有如下提示,沒有報錯,則表示環境無誤,可進行下一步。
留意下紅框裏面的 PHP version:
這裏就是配置好之後的展示效果,PHP language level: 最好和 PHP 容器內一致.
3.配置 Deployment
這個配置是用來讓IDE知道PHP代碼運行環境,以及本地PHP代碼之間的目錄映射關係。
這裏選擇 Local or mounted flolder,首先會讓你輸入 New server name:。
我輸入的是 bs。你也可以輸入別的,但都要記錄下來,後面會用到這個名字。
這裏Folder:配置PHPStorm運行環境的文件路徑。(也就是Mac下文件路徑。)
這裏我們查看下 PHP 容器內代碼路徑.
切到 Deployemnt 配置的 Mapping Tab,在 Deploment path: 填上容器內代碼路徑, Local path: 選擇本地環境代碼路徑。
4.配置PHP > Server, 這裏點擊圓圈內的 導入 按鈕。在彈框中選擇剛剛新增的 Deployment 配置。(就是剛剛輸入的 New server name)
File/Direcotry 你檢查下,一般都沒問題。Absolute path on the server 是你代碼運行的Docker容器內的根目錄。調整好之後,點擊 OK.
先別急,關閉彈框後,再確認下 Absolute path on the server。
這裏估計是 PHPStorm 的一個Bug 還是產品的需求,彈框裏外都要配置一次才好。
好PHPStorm的配置就完成了。
Docker runtime 配置
別急
Docker 運行時容器內,還需配置兩個環境變量 PHP_IDE_CONFIG, XDEBUG_CONFIG.
serverName寫Deployment配置的名字。remote_host填PHPStorm環境的IP,也就是PHP中$_SERVER['REMOTE_ADDR']的值。remote_port默認 900.
- 需要對
docker-compose.yaml配置文件中的 php 容器新增環境變量:
## 文件: ~/docker-compose.yaml
version: "2"
services:
php:
image: paulxu/php:5.6-fpm-jessis-pdo-xdebug-mysqli-gd-mb-zip-2
volumes:
...
ports:
...
environment:
PHP_IDE_CONFIG: "serverName=bs"
XDEBUG_CONFIG: "remote_host=10.0.2.2 remote_port=9000"
- 如果你用的
docker run拉起的容器,加上如下參數
$ docker run ... --env PHP_IDE_CONFIG="serverName=dealman" --env PHP_IDE_CONFIG="serverName=bs" ... php /bin/bash
開始Debug
1.啓用Xdebug listening,點擊以下紅色電話。
現在就是開始偵聽狀態。
2.找到入口文件 ~/index.php,選擇第一行代碼,打一個斷點,(不知道點哪,按Commond+F8)
3.開始訪問Web站點。
這裏第一個斷點是紅色箭頭處,通過點擊綠色按鈕 Step over,代碼一步步執行到了藍色箭頭處,這行代碼也被IDE藍色高亮標底,此時還能從 Variables 看到 已定義變量 $conf 的值。
結語
以前的大佬還在炫耀用notepad手撕代碼,一遍過。在越來越快的開發節奏中,使用高級的工具,以及詳盡的儀表盤來開發調試代碼。希望大家看了,都能配置成功。
有問題歡迎提問。
參考
vscode用xdebug調試php多進程程序
Mac下基於Docker在PhpStorm中配置Xdebug
使用 Xdebug 在 PHPStorm 中調試 PHP 程序(框架/原生均適用)