Windows 10 下使用 PHPStorm 开发/调试 Docker +deockerfile+Swoole + XDebug + Hyperf

前言

Xdebug 应该有很多人并不会陌生,调试安装虽然有些繁琐,但是使用起来还是很顺手。

Docker 和 Swoole ,近年来也是很火,就是不便于调试,很多人看到标题的第一反应「Swoole 不是和 Xdebug 不兼容吗?」,
是的,在 Swoole 的官方文档中就明确指出了 Swoole 和 Xdebug 不兼容。

image

但是,强大的社区还是给了我们答案:SDEBUG

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 下可以通过 官网下载 ,但是需要注意有以下限制。

  • 64 位操作系统
  • 4G 以上的 RAM
  • BIOS 中开启虚拟化
  • Windows 专业版及以上
  • 开启 Hyper-V

这里我并不打算展开介绍,因为类似的文章实在太多了,确保 Docker 安装完成。

当安装完成后,在你的桌面任务栏会出现一个 静态 Docker 的小图标,注意,这里强调一下 静态 静态图标表示 Docker 在运行中,动态则表示处于启动中等非运行状态,然后右键点击,选择 Settings ,我们需要打开两个选项。

  • 1、启用 TCP 连接
image
  • 2、设置国内的 Docker Hub 镜像
image
{
  "registry-mirrors": [
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries": [],
  "debug": true,
  "experimental": false
}

现在,选择右下角的 Apply & Restart 等待 Docker 重启,如果 Docker 没有重启,可以手动点击任务栏 Docker 图标的 Restart ,重启完成后,执行命令检查。

$ 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

现在你应该可以看到网易的镜像地址。

开始吧

检查连接

能否进行调试的重要因素就是 Docker 容器能否和宿主机进行通信,否则,以下都是白扯。

使用 PowersShell 或者 Cmder

就是去改window系统 C:/Windows/System32/drivers/etc/hosts文件加一行

$ 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 /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。
步骤 先

#先不用急着安装,请看完最后一个Dockerfile内容 ,会把这些一起安装
docker pull  php:7.3.17-cli-alpine3.11

然后去工作目录创建一个项目文件夹。比如D盘://docker/php
然后在文件夹里新建一个文件Dockerfile
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

在当前目录 打开命令窗口 cmd 命令

#执行Dockerfile  命令如下
#先不用急着打包,请看完最后一个Dockerfile内容 ,会把这些一起执行
docker build -t="php:7.3.17" .

这样我们的镜像就可以运行 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 表示为我们的镜像起一个名字格式 /:
  • . 最后的 . 表示当前目录
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 -m
[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。

php watch

PHPStorm

打开文件

  • config/autoload/async_queue.php

修改里面的 'processes' => 1,'processes' => 0, 注意,这里是指关掉异步队列,从而来解决
控制台中的 Redis 错误,如果你需要使用到异步队列,请把这里保持不变,并且到 config/autoload/redis.php 中正确配置 redis 链接信息。

保存后,看到控制台会自动重启,现在页面已经不会报错了,在浏览器中访问试试,刚刚我们把宿主机的 8080 映射到了主机内的 9501 端口,
所以我们直接访问本机的 8080 端口。

image

OK,现在我们已经可以访问到 docker 中部署的项目了,接下来配置调试。
打开 PHPStorm 设置 进入 Languages & Frameworks | PHP ,看起来是下面这样。

image

点击这里的 ...

image

选择 + 并选择 From Docker ...

image.png

如果这里没有出现 successful 这说明你在第一步出错了,没有启用 TCP 连接,选择上这里后重启 docker

image

这里选择镜像。


image.png

检查确认后 ok

image

现在进去这里从新选择选择一下容器和本机的映射关系,帮助我们在调试是找到对应的文件,否则会调试失败。

image.png

先删除已有的映射关系,选中默认的映射

image

然后点击上一行的 Mapping 进去添加

image.png

现在添加一下目录映射关系


image

现在,在打开设置 Languages & Frameworks | PHP | Debug

image

创建一个服务,并填写对应的信息,并且请记住 Name XDEBUG_02 这个名字

image

新建一个调试

image

添加一个配置

image.png

现在点击右上角的电话,让他变成这个状态。


image.png

启动调试吧!

image

切换到容器窗口,结束掉先前的命令,现在我们执行 php watch ,你会发现卡住了!!!这特喵什么鬼呀?这就说明 Xdebug 开始工作了
切换到 PHPStorm ,你会发现左边的跳过按钮断点按钮绿了,现在我们从新点到 Debugger 栏目下,你会发现有一个错误。而且 IDE 中没效果。
因为这还么有真正完成。

image.png

现在我们来解决它 ,根据错误错误信息,我们简单了解到,是需要以环境变量,叫 PHP_IDE_CONFIG ,点击 more info...,
进去 PHPStorm 的文档页面,检索一下 PHP_IDE_CONFIG ,发现要让我们配置一个叫 serverName 的参数,
就是前面创建的 Server ,用来映射本地文件。

image.png

因为我们调试的是容器内的 cli ,所以我们切入到容器的终端,输入以下内容

export PHP_IDE_CONFIG=serverName=XDEBUG_02

然后在执行 php watch
现在你就会看,我们在 watch 的时候,断点就开始工作了。

image

现在你进行调试的话,你会发现下面的调试栏,有时候会有好几个 hyperf.php 来回切,很是干扰,
这是因为项目默认配置了使用多个 worker ,你可以在这里把他改成 1。

image

业务调试

现在试试开始调试业务代码吧!
进入默认的控制器,下个断点。

image

打开浏览器刷新,你会发现,并没有发生变化,貌似没有捕获到断点。

image

这时候只需要在URl加上参数 XDEBUG_SESSION_START=PHPSTORM ,
URL 变成了 http://localhost:8080/?XDEBUG_SESSION_START=233
好了现在我们可以看到 PHPStorm 中成功加载到了断点了。

image.png

如果你觉得这样麻烦,可以安装一个 Chrome 扩展 Xdebuge Helper 。
安装以后在插件栏右键选择 选项 ,在 IDE Key 中选择 PHPSTORM 然后 save,回到页面,
左键点击插件栏的虫子,选择 Debug ,现在刷新页面,PHPStorm 就能自动捕获到 Debug 了。

image

在 POSTMAN 中调试

一般的 GET 请求我们可以在浏览器直接调试,但是有时候需要发送 header 或者 post 的时候,
就会选择 POSTMAN 这种工具进行请求,这时候我们只需要在请求参数中加上 XDEBUG_SESSION_START=PHPSTORM 这个参数就行了
也可以 在 Cookie 中添加 XDEBUG_SESSION=PHPSTORM 也可以触发调试。

完结。

整篇下来,比之前那一篇文章还要复杂,但是我已经尽量去用较少的内容讲清楚更多的东西,开发时我们总是离不开调试。

如果你有别的想法或者好的建议可以直接与我联系,如您发现文章内容有错误欢迎指出。

如果你对远程调试还感兴趣,可以看看我的另一篇文章,用来介绍 XDEBUG 远程调试。
Xdebug 远程调试,你会用吗?

你可能感兴趣的:(Windows 10 下使用 PHPStorm 开发/调试 Docker +deockerfile+Swoole + XDebug + Hyperf)