远程调试原理

xdebug.jpg

用语言描述就是:(我自己的理解)

从web访问php文件或者php命令行执行文件,即发送请求a给ph解释器。

php解释器收到请求a后,把请求的相关信息(请求b)发送给一个服务(phpstorm)的监听端口,这个服务是专门用来debug的。

phpstorm收到请求b后,看有无断点,有的话则告诉php解释器执行到哪一步该停止。

php解释器执行到这一步,停止,把到这一步时候内存里的变量发给phpstorm,phpstorm负责展示。

之后每次step in 或者 step over,phpstorm都发请求给php解释器,解释器收到请求一次则执行一次,停止时候发送变量给phpstorm。

vscode操作docker

安装插件

由于后续的操作大部分都是在docker容器里进行的,使用命令行太麻烦了,这里顺便推荐一下vscode操作docker容器的方法。

vscode安装Remote - SSH这个插件,之后就可以连接到linux。我这里用的虚拟机

image-20240122113358633.png

image-20240122113210898.png

连接到linux后,同样安装插件docker,安装完成后会显示Extension is enabled on 'SSH: 192.168.109.128'

image-20240122113337048.png

新建容器

同样是在vscode里把dockerfile和docker-compose.yml写好,然后在控制台docker-compose up -d 启动即可。

image-20240129101324651.png

查看容器

启动完成后即可查看

image-20240129101421476.png

可以直接查看文件目录,可以attach shell,可以 attach vscode。删除容器和镜像都是直接右键remove就行。

image-20240129101447468.png

attach vscode

最喜欢的功能,直接在容器里打开vscode。

左边目录查看文件列表,文本编辑,控制台,都是直接对容器操作的,方便得很。

往容器里传文件,直接拖放即可。

容器里传文件到外面,右键文件,download。

image-20240129101715836.png

调试环境

以下我的php环境全程使用容器,且直接attach vscode的。

php7.1 : FROM php:7.1-apache

php7.4 : FROM php:7.4-apache

php7.1 使用xdebug2

php7.4 使用xdebug3

编译xdebug.so

首先创建容器,然后attach vscode,查看php -i 的信息,复制出来贴到https://xdebug.org/wizard.php

image-20240122105813104.png

根据提示下载对应的xdebug源码,按步骤进行编译。

需要把源码复制到容器里面,在容器里编译,防止出错。

image-20240122105851832.png

image-20240122105930604.png

实际上执行到第7步时,在modules下会生成xdebug.so,得到这个就够了。这个so文件可以留着,以后就不用编译了,除非换版本。

php.ini配置

得到xdebug.so后,需要:

1.把so放到/usr/local/lib/php/extensions/

2.配置php.ini

我用的镜像的容器没有php.ini,需要自己写一个,放到/usr/local/etc/php/。这个位置7.1 和 7.4都能生效。

先得到一个原始的php.ini,然后在最底下添加xdebug的配置。

xdebug2 3 的配置差别:https://xdebug.org/docs/upgrade_guide

xdebug2这样写

zend_extension = /usr/local/lib/php/extensions/xdebug.so
xdebug.remote_autostart=1
xdebug.remote_enable=true
xdebug.remote_host=192.168.109.1
xdebug.remote_port=9010
xdebug.remote_timeout = 3600

xdebug3

zend_extension = /usr/local/lib/php/extensions/xdebug.so
xdebug.mode = debug
xdebug.connect_timeout_ms = 3600000
xdebug.client_host = 192.168.109.1
xdebug.client_port = 9010
xdebug.start_with_request = 1

然后重启apache服务器

phpstorm配置

配置2个东西:path mappings和监听端口。

监听端口:

image-20240122111515182.png

path mappings

这个的作用就是做远程文件和本地文件的对应,不然phpstorm怎么知道远程执行到哪里了。

本地源码的根目录对应到远程源码的根目录的绝对路径。

image-20240122111639045.png

之后右上角开启监听,打断点,访问php页面,phpstorm收到请求后就可以调试了。

image-20240122133554063.png