36

图片来源于网络,如果侵犯到您的权利,请与我联系。

前言

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

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

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

Sdebug 是 fork 自 Xdebug 2.7 ,可用于 Swoole 环境进行断点、调试的一个工具。

现在 Swoole 已经有了 yasd ,可以改用,毕竟 Swoole 和 Xdebug 存在兼容问题。

注意:启用 Xdebug 后会导致你的代码运行变慢,在 Windows10 + IIS(FastCGI)上,原本 500ms 响应速度变长到了 2500ms,为了好的开发体验,请尽量仅在需要时启用 Xdebug ,或者关闭自动启动 Xdebug。

运行环境

软件版本
Windows 10 专业版1909
PHPStorm2020.1
Docker Desktop2.2.0.5(43884)
Docker19.03.8
Hyper-Vlatest
Hyperf (PHP Framework)1.1.25 (hyperf-skeleton create)
Sdebug2.7
PHP7.3.12

Sdebug 版本选择

2020年6月27日 补充更新

根据 swoole/sdebug 仓库的更新,以及 swoole/docker-swoole 的安装脚本。最新的 PHP 7.4 可以使用 swoole/sdebugsdebug_2_9 分支。

根据下方代码中,可以梳理出 PHP 版本与 sdebug 版本的对应关系。

docker-swoole/install-sdebug.sh at master · swoole/docker-swoole

图片.png

PHP 版本Sdebug 分支
7.1.x,7.2.xsdebug
7.3.xsdebug_2_7
7.4.xsdebug_2_9
  • 注意,sdebug_2_7 及以上可能需要 PhpStorm 2019 及以上才能正常工作。

详见 swoole/sdebug 仓库

现在 Swoole 已经有了 yasd ,可以改用,毕竟 Swoole 和 Xdebug 存在兼容问题。

开始安装

Docker && Docker Desktop

Docker 在 Windows 下可以通过 官网下载 ,但是需要注意有以下限制。

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

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

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

  • 1、启用 TCP 连接

  • 2、设置国内的 Docker Hub 镜像

{
  "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

$ 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 命令,但是你在这里是看不到输出的。

$ 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 需要把请求发送过去,所以这里需要确保没有被占用。

安装 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...
好了现在我们可以看到 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 远程调试,你会用吗?

参考内容


唯一丶
23.1k 声望8.6k 粉丝

友情链接