基于docker的xdebug调试环境

前言

xdebug是用于php的调试插件,可以让我们进行远程调试,在PHP代码进行调试的时候可以不用var_dump()了。由于docker用起来比较方便,我之前就写过一个Dockerfile用于搭建xdebug环境,最近想做点代码审计,然后又把之前写的东西又改了改。

xdebug的工作原理

  • IDE首先监听9000和9003端口,同时做好路径映射
  • 浏览器访问服务器,并且在Cookie中携带XDEBUG_SESSION=IDEKEY
  • 服务器检测到Cookie时将debug信息转发到客户端的debug端口上进行调试

基于docker搭建xdebug调试环境

安装xdebug扩展

首先需要下载安装linux下可用的xdebug扩展:https://pecl.php.net/package/xdebug

然后在容器中执行pecl install xdebug-3.1.5.tgz 就可以安装好xdebug

xdebug配置文件

xdebug的配置文件如下

1
2
3
4
5
zend_extension=xdebug
xdebug.idekey=PHPSTORM
xdebug.client_host=host.docker.internal
xdebug.client_port=9000
xdebug.mode=debug

xdebug配置文件中需要有客户端的地址和端口,在docker中可以通过host.docker.internal访问到宿主机。不过由于在Mac下无法通过这种方式访问宿主机,只能手动指定ip

打包成镜像

调试好Dockerfile之后我制作了e4stjun/xdebug3镜像,通过执行docker run -p 8888:80 -v "c:\code:/var/www/html/" -d e4stjun/xdebug3 就能直接搭起来xdebug环境。然后再写个docker-compose.yaml,比如审计一些cms还需要mysql数据库,就可以再pull一个mysql的镜像,还有时候需要对apache配置文件进行修改也可以直接在宿主机修改,不需要进入容器内再编辑:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '3'
services:
  xdebug3:
    image: e4stjun/xdebug3:latest
    container_name: xdebug3
    build:
      context: xdebug3
      dockerfile: Dockerfile
    ports:
      - "8888:80"
    volumes:
      - ./src:/var/www/html/:rw
      - ./conf:/etc/apache2/sites-enabled/
      - ./xdebug3/ini/:/usr/local/etc/php/conf.d/
    environment:
      - TZ=Asia/Shanghai
  db:
    image: mysql:8.0.33
    container_name: mysql8
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - ./data:/var/lib/mysql

我也在自己的服务器上放了一份xdebug3fordocker可以自己下载。

使用方法

所以其实只需要将解压这份文件,将源码放进src文件夹中,然后docker-compose up -d就能运行起来

image-20230706000150468

PHPSTORM开启监听

需要用PHPSTORM再Debug Configuration处设置PHP Remote Debug,并且设置好目录映射以及IDEkey,主要注意圈出来的几个地方就行了:

image-20230705233548460

Xdebug Helper插件

到这里想要开启debug还需要客户端在访问服务器的时候在Cookie中携带XDEBUG_SESSION=IDEKEY,Xdebug Helper是Chrome中的一个插件,可以让我们在访问服务器的时候自动带上对应的Cookie:

image-20230705220835803

在xdebug helper中还需要设置对应的IDE key:

image-20230705234212936

调试

然后使用PHPSTORM在代码中下断点,然后开着xdebug helper访问服务器就可以开始调试了

image-20230705234018657

updatedupdated2023-07-052023-07-05