Windows 10 下使用 PHPStorm 開發/調試, Docker + Swoole + XDebug + Hyperf

圖片來源於網絡,若是侵犯到您的權利,請與我聯繫。php

前言

Xdebug 應該有不少人並不會陌生,調試安裝雖然有些繁瑣,可是使用起來仍是很順手。html

Docker 和 Swoole ,近年來也是很火,就是不便於調試,不少人看到標題的第一反應「Swoole 不是和 Xdebug 不兼容嗎?」,
是的,在 Swoole 的官方文檔中就明確指出了 Swoole 和 Xdebug 不兼容。mysql

可是,強大的社區仍是給了咱們答案:SDEBUGlinux

Sdebug 是 fork 自 Xdebug 2.7 ,可用於 Swoole 環境進行斷點、調試的一個工具。

運行環境

軟件 版本
Windows 10 專業版 1909
PHPStorm 2020.1
Docker Desktop 2.2.0.5(43884)
Docker 19.03.8
Hyper-V latest
Hyperf (PHP Framework) 1.1.25 (hyperf-skeleton create)
Sdebug 2.7
PHP 7.3.12

開始安裝

Docker && Docker Desktop

Docker 在 Windows 下能夠經過 官網下載 ,可是須要注意有如下限制。git

  • 64 位操做系統
  • 4G 以上的 RAM
  • BIOS 中開啓虛擬化
  • Windows 專業版及以上
  • 開啓 Hyper-V

這裏我並不打算展開介紹,由於相似的文章實在太多了,確保 Docker 安裝完成。github

當安裝完成後,在你的桌面任務欄會出現一個 靜態 Docker 的小圖標,注意,這裏強調一下 靜態 靜態圖標表示 Docker 在運行中,動態則表示處於啓動中等非運行狀態,而後右鍵點擊,選擇 Settings ,咱們須要打開兩個選項。web

  • 一、啓用 TCP 鏈接

  • 二、設置國內的 Docker Hub 鏡像

{
  "registry-mirrors": [
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries": [],
  "debug": true,
  "experimental": false
}

如今,選擇右下角的 Apply & Restart 等待 Docker 重啓,若是 Docker 沒有重啓,能夠手動點擊任務欄 Docker 圖標的 Restart ,重啓完成後,執行命令檢查。redis

$ docker info
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:
 http://hub-mirror.c.163.com/
Live Restore Enabled: false
Product License: Community Engine

如今你應該能夠看到網易的鏡像地址。sql

開始吧

檢查鏈接

可否進行調試的重要因素就是 Docker 容器可否和宿主機進行通訊,不然,如下都是白扯。chrome

使用 PowersShell 或者 Cmder

$ cat C:/Windows/System32/drivers/etc/hosts|findstr host.docker.internal
192.168.3.22 host.docker.internal

執行後你應該能夠看到輸出了一個 192.168.x.x 的 IP ,映射到了 host.docker.internal,請記住這個 IP。
如今執行以下命令,運行一個 alpine linux 容器,並執行一個 ping 命令,可是你在這裏是看不到輸出的。

  • 擴展閱讀
Networking features in Docker Desktop for Windows | Docker Documentation
$ docker run -di alpine:latest
a8369f4e057e161c2079281e4bfbc31dc509f802e3ce0c2f09708cd8613459ae

接着執行如下命令獲取到容器的 ID ,其實在上一條執行完畢咱們就已經獲得了容器 ID。

$ docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED              STATUS              PORTS               NAMES
a8369f4e057e        alpine:latest       "/bin/sh"   About a minute ago   Up About a minute                       pensive_lehmann

使用 docker exec 打開能夠能夠和容器交互的命令行。

$ docker exec -it a8369f4e057e sh

通常咱們看到的命令都是 docker exec -it <CONTAINER ID> /bin/bash ,可是 alpine 沒有 /bin/bash 這個位置,因此這裏咱們直接用 sh 便可。
在進去終端後,咱們重新執行一下 ping 命令。

/ # ping 192.168.3.22
PING 192.168.3.22 (192.168.3.22): 56 data bytes
64 bytes from 192.168.3.22: seq=0 ttl=37 time=1.003 ms
64 bytes from 192.168.3.22: seq=1 ttl=37 time=0.937 ms
64 bytes from 192.168.3.22: seq=2 ttl=37 time=1.026 ms
64 bytes from 192.168.3.22: seq=3 ttl=37 time=1.141 ms
^C
--- 192.168.3.22 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.937/1.026/1.141 ms

若是能輸出正常的 ping 信息,說明咱們的 docker 容器內部能夠和主機通訊了。
若是不行,能夠嘗試 ping 192.168.56.1
若是這兩個命令都 ping 不通,我以爲你就不必看了,😨由於最基本的就是要作到 Docker 容器內部和宿主機通訊,才能
使用 Xdebug,若是你只是想搭建一個開發環境,那麼你還能夠繼續看下去。

接下來的內容,我會帶你使用 Dockerfile 構建一個本身的 Docker PHP 開發環境。

Docker

安裝 PHP

大多數狀況下,我都會選用最新的 PHP 做爲開發使用,除非項目要求使用舊版,這裏就屬於狀況例外。由於 Sdebug 是基於 Xdebug 2.7 的,
而 Xdebug 2.7 是不支持最新的 PHP 7.4 的,因此咱們只能到 Docker Hub PHP Library 選擇一個較新的 php:7.3.17-cli-alpine3.11 這個 tag。
新建一個 php.dockerfile 文件,並安裝一些必要的擴展和 Composer。

FROM php:7.3.17-cli-alpine3.11
# 如今咱們須要配置一些東西。
# 編譯參數,用於指定 Swoole 版本
ARG swoole_ver
# 保存到環境變量,若是沒有傳遞就給默認值
ENV SWOOLE_VER=${swoole_ver:-"v4.4.15"}

# apk 是 alpine 的一個包管理器
# set -ex 是爲了在出錯時及時停掉腳本
RUN set -ex \
    # 在臨時目錄進行這一切
    && cd /tmp \
    # 把 apk 的默認源改成aliyun鏡像
    && sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    # 更新包列表
    && apk update \
    # 添加這麼多擴展是由於後面咱們編譯 swoole 和 sdebug 須要用到 
    && apk add vim git autoconf openssl-dev build-base zlib-dev re2c libpng-dev oniguruma-dev

# install composer
RUN cd /tmp \
    # 從aliyun 下載composer 
    && wget https://mirrors.aliyun.com/composer/composer.phar \
    && chmod u+x composer.phar \
    && mv composer.phar /usr/local/bin/composer \
    # 給 composer 設置aliyun鏡像
    && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer \
    # 把 composer 全局命令加入 PATH ,以確保之後咱們會用到
    && echo 'export PATH="$PATH:$HOME/.composer/vendor/bin"' >> ~/.bashrc

# php ext
RUN php -m \
    # docker-php-ext-install 是 php 爲咱們提供的指令,讓咱們能夠安裝一些 php 的預設擴展
    # 能夠在這裏啓用必要的擴展
    && docker-php-ext-install gd pdo_mysql mysqli sockets pcntl \
    # 如今能夠檢查一下 php 已經安裝的擴展
    && php -m

這樣咱們的鏡像就能夠運行 php 了,可是接下來咱們還要安裝 swoole 。

安裝 Swoole

若是用過 PECL 的朋友可能會知道,Swoole、PhpRedis 能夠用 PECL 直接安裝,可是 PECL 安裝由於下載比較慢,因此咱們這裏
採用 Swoole 官方在國內的倉庫

# install swoole
RUN cd /tmp \
    # from mirrors
    && git clone https://gitee.com/swoole/swoole swoole \
    && cd swoole \
    # 切換到指定版本的 tag
    && git checkout ${SWOOLE_VER} \
    && phpize \
    # 執行configure命令
    && ./configure --enable-openssl --enable-sockets --enable-http2 --enable-mysqlnd \
    && make \
    && make install \
    # 經過 docker-php-ext-enable 來啓用擴展,這個命令也是 php 爲咱們提供的。
    && docker-php-ext-enable swoole \
    # 檢查 php 已經安裝的模塊
    && php -m \
    # 檢查 swoole 是否正確安裝
    && php --ri swoole

安裝 Sdebug

Sdebug 源代碼託管在了 Github 上面,衆所周知,由於一些緣由,Github 下載速度很慢,因此咱們須要使用到國內鏡像,
可是 Sdebug 在國內貌似也沒有鏡像,因此就要咱們本身動手了,到 碼雲 ,註冊一個賬號,而後新建項目選擇從 Github 導入,
這樣咱們就能建立一個倉庫的鏡像了,我已經建立好了一個 Sdebug ,若是你介意的話,能夠本身建立一個,方法就在上面。
安裝 Sdebug 的過程和 Swoole 幾乎徹底同樣,可是也要注意一些點,接下來在 Dockerfile 中我將會詳細註釋

# install sdebug
# 運行克隆前,先把目錄切換到 /tmp ,避免以前的命令致使目錄錯誤
RUN cd /tmp \
    # from mirrors
    && git clone https://gitee.com/vyi/sdebug sdebug \
    # 進入克隆的目錄
    && cd sdebug \
    # 切換到 sdebug_2_7 分支,這裏必定到切換分支,由於 master 分支是 Xdebug 的源碼
    && git checkout sdebug_2_7 \
    && phpize \
    && ./configure --enable-xdebug \
    && make \
    && make install \
    # 這裏 安裝完成後執行的值 xdebug
    && docker-php-ext-enable xdebug \
    && php -m \
    # 這裏檢查也是喲,注意是 sdebug
    && php --ri sdebug

如今一切都安裝完成了,咱們還須要對 swoole 和 sdebug 進行簡單的配置,跟剛纔同樣,這裏仍是使用 Dockerfile 指令
/usr/local/etc/php/conf.d 這個位置是 php 默認會掃描的 ini 加載目錄,咱們能夠執行php --ini命令檢查

/mnt/d/htdocs/tom # php --ini
Configuration File (php.ini) Path: /usr/local/etc/php
Loaded Configuration File:         (none)
Scan for additional .ini files in: /usr/local/etc/php/conf.d
Additional .ini files parsed:      /usr/local/etc/php/conf.d/99-xdebug-enable.ini,
/usr/local/etc/php/conf.d/docker-php-ext-gd.ini,
/usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini,
/usr/local/etc/php/conf.d/docker-php-ext-pcntl.ini,
/usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini,
/usr/local/etc/php/conf.d/docker-php-ext-redis.ini,
/usr/local/etc/php/conf.d/docker-php-ext-sockets.ini,
/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini,
/usr/local/etc/php/conf.d/docker-php-ext-swoole.ini,
/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

能夠看到如下內容,也就是說他會在這裏掃描配置文件

Scan for additional .ini files in: /usr/local/etc/php/conf.d
# config php
RUN cd /usr/local/etc/php/conf.d \
    # swoole config
    # 關閉 swoole 短名稱,使用 Hyperf 這個是必需要
    && echo "swoole.use_shortname = off" >> 99-off-swoole-shortname.ini \
    # config xdebug
    && { \
        # 添加一個 Xdebug 節點
        echo "[Xdebug]"; \
        # 啓用遠程鏈接
        echo "xdebug.remote_enable = 1"; \
        # 這個是多人調試,可是如今有些困難,就暫時不啓動
        echo ";xdebug.remote_connect_back = On"; \
        # 自動啓動遠程調試
        echo "xdebug.remote_autostart  = true"; \
        # 這裏 host 能夠填前面取到的 IP ,也能夠填寫 host.docker.internal 。
        echo "xdebug.remote_host = host.docker.internal"; \
        # 這裏端口固定填寫 19000 ,固然能夠填寫其餘的,須要保證沒有被佔用
        echo "xdebug.remote_port = 19000"; \
        # 這裏固定便可
        echo "xdebug.idekey=PHPSTORM"; \
        # 把執行結果保存到 99-xdebug-enable.ini 裏面去
    } | tee 99-xdebug-enable.ini

host.docker.internal 和 19000 這兩個是必然關係,這 host 指向的是宿主機,端口是 PHP Storm 監聽的端口,docker 須要把請求發送過去,因此這裏須要確保沒有被佔用。

  • 擴展閱讀
Networking features in Docker Desktop for Windows | Docker Documentation

安裝 PhpRedis

由於項目須要鏈接 Redis 因此使用這個擴展,這個只是一個鏈接庫,並非 Redis。

# install phpredis
RUN cd /tmp \
    # from mirrors
    && git clone https://gitee.com/mirrors/phpredis phpredis \
    && cd phpredis \
    && phpize \
    && ./configure \
    && make \
    && make install \
    && docker-php-ext-enable redis \
    && php -m \
    && php --ri redis

雜項配置

# check
# 檢查一下 PHP 版本信息和 已安裝的模塊
RUN cd /tmp \
    # 檢查 PHP 版本
    && php -v \
    # 檢查已安裝的模塊
    && php -m \
    && echo -e "Build Completed!"

# 暴露 9501 端口
EXPOSE 9501
# 設置工做目錄,即默認登陸目錄,這個目錄如今並不存在,
# 咱們須要在 run 時把咱們外部 windows 的文件目錄映射到 docker 容器中去
WORKDIR /mnt/d/htdocs

Dockerfile

如今咱們的 Dockerfile 應該已是下面的樣子

FROM php:7.3.17-cli-alpine3.11
# 如今咱們須要配置一些東西。
# 編譯參數,用於指定 Swoole 版本
ARG swoole_ver
# 保存到環境變量,若是沒有傳遞就給默認值
ENV SWOOLE_VER=${swoole_ver:-"v4.4.15"}

# apk 是 alpine 的一個包管理器
# set -ex 是爲了在出錯時及時停掉腳本
RUN set -ex \
    # 在臨時目錄進行這一切
    && cd /tmp \
    # 把 apk 的默認源改成aliyun鏡像
    && sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    # 更新包列表
    && apk update \
    # 添加這麼多擴展是由於後面咱們編譯 swoole 和 sdebug 須要用到 
    && apk add vim git autoconf openssl-dev build-base zlib-dev re2c libpng-dev oniguruma-dev

# install composer
RUN cd /tmp \
    # 從aliyun 下載composer 
    && wget https://mirrors.aliyun.com/composer/composer.phar \
    && chmod u+x composer.phar \
    && mv composer.phar /usr/local/bin/composer \
    # 給 composer 設置aliyun鏡像
    && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer \
    # 把 composer 全局命令加入 PATH ,以確保之後咱們會用到
    && echo 'export PATH="$PATH:$HOME/.composer/vendor/bin"' >> ~/.bashrc

# php ext
RUN php -m \
    # docker-php-ext-install 是 php 爲咱們提供的指令,讓咱們能夠安裝一些 php 的預設擴展
    # 能夠在這裏啓用必要的擴展
    && docker-php-ext-install gd pdo_mysql mysqli sockets pcntl \
    # 如今能夠檢查一下 php 已經安裝的擴展
    && php -m


# install swoole
RUN cd /tmp \
    # from mirrors
    && git clone https://gitee.com/swoole/swoole swoole \
    && cd swoole \
    # 切換到指定版本的 tag
    && git checkout ${SWOOLE_VER} \
    && phpize \
    # 執行configure命令
    && ./configure --enable-openssl --enable-sockets --enable-http2 --enable-mysqlnd \
    && make \
    && make install \
    # 經過 docker-php-ext-enable 來啓用擴展,這個命令也是 php 爲咱們提供的。
    && docker-php-ext-enable swoole \
    # 檢查 php 已經安裝的模塊
    && php -m \
    # 檢查 swoole 是否正確安裝
    && php --ri swoole

# install sdebug
# 運行克隆前,先把目錄切換到 /tmp ,避免以前的命令致使目錄錯誤
RUN cd /tmp \
    # from mirrors
    && git clone https://gitee.com/vyi/sdebug sdebug \
    # 進入克隆的目錄
    && cd sdebug \
    # 切換到 sdebug_2_7 分支,這裏必定到切換分支,由於 master 分支是 Xdebug 的源碼
    && git checkout sdebug_2_7 \
    && phpize \
    && ./configure --enable-xdebug \
    && make \
    && make install \
    # 這裏 安裝完成後執行的值 xdebug
    && docker-php-ext-enable xdebug \
    && php -m \
    # 這裏檢查也是喲,注意是 sdebug
    && php --ri sdebug


# config php
RUN cd /usr/local/etc/php/conf.d \
    # swoole config
    # 關閉 swoole 短名稱,使用 Hyperf 這個是必需要
    && echo "swoole.use_shortname = off" >> 99-off-swoole-shortname.ini \
    # config xdebug
    && { \
        # 添加一個 Xdebug 節點
        echo "[Xdebug]"; \
        # 啓用遠程鏈接
        echo "xdebug.remote_enable = 1"; \
        # 這個是多人調試,可是如今有些困難,就暫時不啓動
        echo ";xdebug.remote_connect_back = On"; \
        # 自動啓動遠程調試
        echo "xdebug.remote_autostart  = true"; \
        # 這裏 host 能夠填前面取到的 IP ,也能夠填寫 host.docker.internal 。
        echo "xdebug.remote_host = host.docker.internal"; \
        # 這裏端口固定填寫 19000 ,固然能夠填寫其餘的,須要保證沒有被佔用
        echo "xdebug.remote_port = 19000"; \
        # 這裏固定便可
        echo "xdebug.idekey=PHPSTORM"; \
        # 把執行結果保存到 99-xdebug-enable.ini 裏面去
    } | tee 99-xdebug-enable.ini


# install phpredis
RUN cd /tmp \
    # from mirrors
    && git clone https://gitee.com/mirrors/phpredis phpredis \
    && cd phpredis \
    && phpize \
    && ./configure \
    && make \
    && make install \
    && docker-php-ext-enable redis \
    && php -m \
    && php --ri redis


# check
# 檢查一下 PHP 版本信息和 已安裝的模塊
RUN cd /tmp \
    # 檢查 PHP 版本
    && php -v \
    # 檢查已安裝的模塊
    && php -m \
    && echo -e "Build Completed!"

# 暴露 9501 端口
EXPOSE 9501
# 設置工做目錄,即默認登陸目錄,這個目錄如今並不存在,
# 咱們須要在 run 時把咱們外部 windows 的文件目錄映射到 docker 容器中去
WORKDIR /mnt/d/htdocs

以上就是咱們完整的 Dockerfile,如今咱們要來生成一下鏡像文件

docker build -f php.dockerfile -t faqqcn/php-swoole-sdebug:1.0 .
  • -f 表示咱們要使用那個 dockerfile 文件
  • -t 表示爲咱們的鏡像起一個名字格式 <domain>/<name>:<tag>
  • . 最後的 . 表示當前目錄
Successfully built 9c5c20556cf2
Successfully tagged faqqcn/php-swoole-sdebug:1.0
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

輸出以上內容說明鏡像製做成功了,如今來看一下。

$ docker image ls                                                                                     
REPOSITORY                 TAG                         IMAGE ID            CREATED              SIZE  
faqqcn/php-swoole-sdebug   1.0                         9c5c20556cf2        About a minute ago   526MB

如今來運行一下

$ docker run -di -p 8080:9501 -v D:/2vy-cc/htdocs:/mnt/d/htdocs --name php-swoole-sdebug faqqcn/php-swoole-sdebug:1.0
19db6032c9fe9cd2228844e4c029c980f14172991a4f113480ee5facd1763c2e
  • 參數解釋
參數 說明
-di 這是兩個參數 -d 和 -i 的簡寫,d 表示後臺運行,i 表示交互操做
-p 啓用一個端口映射,把宿主機的 8080 和 容器 內的 9501 映射
-v 啓用一個目錄映射,把宿主機的 D:/2vy-cc/htdocs 目錄和 容器內的 /mnt/d/htdocs 映射
--name 給容器起一個名字,方便下次啓動、停用、刪除、日誌

更多參數詳見 Docker run 命令

最後面就跟上咱們鏡像的名字,而後 docker 會輸出一個容器的 id

如今進入容器。

docker exec -it php-swoole-sdebug sh

-it 表示建立一個交互操做和建立一個終端,後面跟剛剛上面的 name ,最後跟一個啓動的 shell , alpine 默認是 sh
進入到終端內後檢查一下 php 信息,並建立一下項目

# php -v                                                 
PHP 7.3.17 (cli) (built: Apr 24 2020 18:12:13) ( NTS )                 
Copyright (c) 1997-2018 The PHP Group                                  
Zend Engine v3.3.17, Copyright (c) 1998-2018 Zend Technologies         
    with Sdebug v2.7.3-dev, Copyright (c) 2002-2019, by Derick Rethans 

# php
[PHP Modules]      
Core               
ctype              
curl               
date               
dom                
fileinfo           
filter             
ftp                
gd                 
hash               
iconv              
json               
libxml             
mbstring           
mysqli             
mysqlnd            
openssl            
pcntl              
pcre               
PDO                
pdo_mysql          
pdo_sqlite         
Phar               
posix              
readline           
redis              
Reflection         
sdebug             
session            
SimpleXML          
sockets            
sodium             
SPL                
sqlite3            
standard           
swoole             
tokenizer          
xml                
xmlreader          
xmlwriter          
zlib               
                   
[Zend Modules]     
Sdebug             

# composer                                      
   ______                                            
  / ____/___  ____ ___  ____  ____  ________  _____  
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/  
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /      
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/       
                    /_/                              
Composer version 1.10.5 2020-04-10 11:44:22

能夠看到已經安裝 swoole、redis、Sdebug、composer ,接下來咱們將建立一個 Hyperf 項目

建立項目

# composer create-project hyperf/hyperf-skeleton

安裝過程當中會有一個引導,這裏你能夠所有敲回車默認,也能夠根據須要選擇本身要用的組件。
如今進入項目,並啓動。

cd hyperf-skeleton
php bin/hyperf.php start

你將會看到一切錯誤蹦了出來,可是不要擔憂,若是你細看,你會發現這是 Redis 的錯誤,稍後咱們來解決它。
爲了咱們愉快的開發,若是每次修改文件後咱們都要來執行一下上面的命令,豈不是很麻煩,
咱們如今來安裝一個自動文件修改後自動重啓的工具 hyperf-watch

# curl -o watch https://gitee.com/liangguifeng/hyperf-watch/raw/master/watch

# ls -alF | grep watch
  -rwxr-xr-x    1 root     root          3921 May  4 07:40 watch*

若是這裏的 watch 權限中沒有 x 咱們就手動給他加一下

chmod +x watch

如今咱們執行 php watch。而後在宿主機中打開 PHPStorm ,開始在 PHPStorm 裏面寫代碼,並配置 Sdebug。

PHPStorm

打開文件

  • config/autoload/async_queue.php

修改裏面的 'processes' => 1,'processes' => 0, 注意,這裏是指關掉異步隊列,從而來解決
控制檯中的 Redis 錯誤,若是你須要使用到異步隊列,請把這裏保持不變,而且到 config/autoload/redis.php 中正確配置 redis 連接信息。

保存後,看到控制檯會自動重啓,如今頁面已經不會報錯了,在瀏覽器中訪問試試,剛剛咱們把宿主機的 8080 映射到了主機內的 9501 端口,
因此咱們直接訪問本機的 8080 端口。

OK,如今咱們已經能夠訪問到 docker 中部署的項目了,接下來配置調試。
打開 PHPStorm 設置 進入 Languages & Frameworks | PHP ,看起來是下面這樣。

點擊這裏的 ...

選擇 + 並選擇 From Docker ...

若是這裏沒有出現 successful 這說明你在第一步出錯了,沒有啓用 TCP 鏈接,選擇上這裏後重啓 docker

這裏選擇鏡像。

檢查確認後 ok

如今進去這裏重新選擇選擇一下容器和本機的映射關係,幫助咱們在調試是找到對應的文件,不然會調試失敗。

先刪除已有的映射關係,選中默認的映射

而後點擊上一行的 Mapping 進去添加

如今添加一下目錄映射關係

如今,在打開設置 Languages & Frameworks | PHP | Debug

建立一個服務,並填寫對應的信息,而且請記住 Name XDEBUG_02 這個名字

新建一個調試

添加一個配置

如今點擊右上角的電話,讓他變成這個狀態。

啓動調試吧!

切換到容器窗口,結束掉先前的命令,如今咱們執行 php watch ,你會發現卡住了!!!這特喵什麼鬼呀?這就說明 Xdebug 開始工做了
切換到 PHPStorm ,你會發現左邊的跳過按鈕斷點按鈕綠了,如今咱們重新點到 Debugger 欄目下,你會發現有一個錯誤。並且 IDE 中沒效果。
由於這還麼有真正完成。

如今咱們來解決它 ,根據錯誤錯誤信息,咱們簡單瞭解到,是須要以環境變量,叫 PHP_IDE_CONFIG ,點擊 more info...,
進去 PHPStorm 的文檔頁面,檢索一下 PHP_IDE_CONFIG ,發現要讓咱們配置一個叫 serverName 的參數,
就是前面建立的 Server ,用來映射本地文件。

由於咱們調試的是容器內的 cli ,因此咱們切入到容器的終端,輸入如下內容

export PHP_IDE_CONFIG=serverName=XDEBUG_02

而後在執行 php watch
如今你就會看,咱們在 watch 的時候,斷點就開始工做了。

如今你進行調試的話,你會發現下面的調試欄,有時候會有好幾個 hyperf.php 來回切,非常干擾,
這是由於項目默認配置了使用多個 worker ,你能夠在這裏把他改爲 1。

業務調試

如今試試開始調試業務代碼吧!
進入默認的控制器,下個斷點。

打開瀏覽器刷新,你會發現,並無發生變化,貌似沒有捕獲到斷點。

這時候只須要在URl加上參數 XDEBUG_SESSION_START=PHPSTORM ,
URL 變成了 http://localhost:8080/?XDEBUG_SESSION_START=233
好了如今咱們能夠看到 PHPStorm 中成功加載到了斷點了。

若是你以爲這樣麻煩,能夠安裝一個 Chrome 擴展 Xdebuge Helper
安裝之後在插件欄右鍵選擇 選項 ,在 IDE Key 中選擇 PHPSTORM 而後 save,回到頁面,
左鍵點擊插件欄的蟲子,選擇 Debug ,如今刷新頁面,PHPStorm 就能自動捕獲到 Debug 了。

在 POSTMAN 中調試

通常的 GET 請求咱們能夠在瀏覽器直接調試,可是有時候須要發送 header 或者 post 的時候,
就會選擇 POSTMAN 這種工具進行請求,這時候咱們只須要在請求參數中加上 XDEBUG_SESSION_START=PHPSTORM 這個參數就好了
也能夠 在 Cookie 中添加 XDEBUG_SESSION=PHPSTORM 也能夠觸發調試。

完結。

整篇下來,比以前那一篇文章還要複雜,可是我已經儘可能去用較少的內容講清楚更多的東西,開發時咱們老是離不開調試。

若是你有別的想法或者好的建議能夠直接與我聯繫,如您發現文章內容有錯誤歡迎指出。

若是你對遠程調試還感興趣,能夠看看個人另外一篇文章,用來介紹 XDEBUG 遠程調試。
Xdebug 遠程調試,你會用嗎?

參考內容

相關文章
相關標籤/搜索