史上最全 PHPStorm Xdebug 斷點調試 Docker 環境下 PHP教程

爲何

PHP程序報錯,肉眼review了多少遍都以爲本身的寫得沒問題;有個switch代碼分支判斷,爲何進不了我想要的case; 調試PHP代碼還在用 var_dump($re); die();。試試Xdebug斷點調試吧。php

他能作什麼

開啓Debug監聽,一步步順着代碼走進程序的最深處。你會了解到真實的代碼運行步驟,以及調用關係。你還能知道每一個變量在程序運行時,值的多少,以及變化。同時避免了 var_dump 代碼植入,(若是忘了刪除,提交到線上,那這個恥辱柱會狠狠地釘在你身上)html

好的來介紹下咱們的這期主角 Xdebug前端

Xdebug 是

Xdebug是一個PHP擴展,提供了調試和性能分析功能。[1]它使用DBGp調試協議。mysql

Xdebug能夠提供的調試信息包括如下內容:git

  • 錯誤消息[2]中的堆棧和函數跟蹤具備:
  • 用戶定義功能的全參數顯示
  • 函數名稱,文件名和行指示
  • 支持成員功能
  • 內存分配
  • 保護無限遞歸

Xdebug還提供:github

  • PHP腳本的概要分析信息[3]
  • 代碼覆蓋率分析
  • 調試器前端交互地調試腳本的功能。[4]
以上摘自 wiki

開始動手

環境介紹

這篇文章主要圍繞Docker環境下PHP的Xdebug調試展開。sql

先說下筆者演示環境:Mac環境,安裝Virtual Box,跑了一個Ubuntu虛擬機,再裝了Docker ce軟件。看到這,大夥兒先別急着關網頁啊,個人環境估計有些奇葩,但大體流程是差很少的。docker

這套PHP Docker環境這篇文章有詳細介紹: [Docker快速搭建一套PHP、Nginx、MySQL、Redis、Xdebug、Memcached 開發環境shell

安裝軟件

爲 PHP 安裝 Xdebug

Xdebug 官方文檔已介紹。segmentfault

  • 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 就填多少。

image.png

配置 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: 名字要記下來,後面要用。

image.png

2.新增PHP Cli Interpreter.

搜索: php language,點擊最右側 ··· 按鈕

image.png

選擇 From Dcoker...

image.png

這裏的 Server: 名字選擇 第 1 步 的 Dcoker Server 的名字。 Image name: 選擇你的php容器。

image.png

點擊確認後,PHPStorm會檢查 PHP容器的版本,Xdebug拓展是否啓用。有以下提示,沒有報錯,則表示環境無誤,可進行下一步。

留意下紅框裏面的 PHP version:

image.png

這裏就是配置好以後的展現效果,PHP language level: 最好和 PHP 容器內一致.

image.png

3.配置 Deployment

這個配置是用來讓IDE知道PHP代碼運行環境,以及本地PHP代碼之間的目錄映射關係。

image.png

這裏選擇 Local or mounted flolder,首先會讓你輸入 New server name:

我輸入的是 bs。你也能夠輸入別的,但都要記錄下來,後面會用到這個名字。

image.png

這裏Folder:配置PHPStorm運行環境的文件路徑。(也就是Mac下文件路徑。)

image.png

這裏咱們查看下 PHP 容器內代碼路徑.

image.png

切到 Deployemnt 配置的 Mapping Tab,在 Deploment path: 填上容器內代碼路徑, Local path: 選擇本地環境代碼路徑。

image.png

4.配置PHP > Server, 這裏點擊圓圈內的 導入 按鈕。在彈框中選擇剛剛新增的 Deployment 配置。(就是剛剛輸入的 New server name

image.png

File/Direcotry 你檢查下,通常都沒問題。Absolute path on the server 是你代碼運行的Docker容器內的根目錄。調整好以後,點擊 OK.

image.png

先別急,關閉彈框後,再確認下 Absolute path on the server

這裏估計是 PHPStorm 的一個Bug 仍是產品的需求,彈框裏外都要配置一次纔好。

image.png

好PHPStorm的配置就完成了。

Docker runtime 配置

別急

Docker 運行時容器內,還需配置兩個環境變量 PHP_IDE_CONFIG, XDEBUG_CONFIG.

  1. serverNameDeployment 配置的名字。
  2. remote_host 填PHPStorm環境的IP,也就是PHP中 $_SERVER['REMOTE_ADDR'] 的值。
  3. 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,點擊如下紅色電話。

image.png

如今就是開始偵聽狀態。

image.png

2.找到入口文件 ~/index.php,選擇第一行代碼,打一個斷點,(不知道點哪,按Commond+F8)

image.png

3.開始訪問Web站點。

這裏第一個斷點是紅色箭頭處,經過點擊綠色按鈕 Step over,代碼一步步執行到了藍色箭頭處,這行代碼也被IDE藍色高亮標底,此時還能從 Variables 看到 已定義變量 $conf 的值。

image.png

結語

之前的大佬還在炫耀用notepad手撕代碼,一遍過。在愈來愈快的開發節奏中,使用高級的工具,以及詳盡的儀表盤來開發調試代碼。但願你們看了,都能配置成功。

有問題歡迎提問。

參考

vscode用xdebug調試php多進程程序
Mac下基於Docker在PhpStorm中配置Xdebug
使用 Xdebug 在 PHPStorm 中調試 PHP 程序(框架/原生均適用)

相關文章
相關標籤/搜索