远程调试原理
用语言描述就是:(我自己的理解)
从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。我这里用的虚拟机
连接到linux后,同样安装插件docker,安装完成后会显示Extension is enabled on 'SSH: 192.168.109.128'
新建容器
同样是在vscode里把dockerfile和docker-compose.yml写好,然后在控制台docker-compose up -d
启动即可。
查看容器
启动完成后即可查看
可以直接查看文件目录,可以attach shell,可以 attach vscode。删除容器和镜像都是直接右键remove就行。
attach vscode
最喜欢的功能,直接在容器里打开vscode。
左边目录查看文件列表,文本编辑,控制台,都是直接对容器操作的,方便得很。
往容器里传文件,直接拖放即可。
容器里传文件到外面,右键文件,download。
调试环境
以下我的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
根据提示下载对应的xdebug源码,按步骤进行编译。
需要把源码复制到容器里面,在容器里编译,防止出错。
实际上执行到第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 |
xdebug3
zend_extension = /usr/local/lib/php/extensions/xdebug.so |
然后重启apache服务器
phpstorm配置
配置2个东西:path mappings和监听端口。
监听端口:
path mappings
这个的作用就是做远程文件和本地文件的对应,不然phpstorm怎么知道远程执行到哪里了。
本地源码的根目录对应到远程源码的根目录的绝对路径。
之后右上角开启监听,打断点,访问php页面,phpstorm收到请求后就可以调试了。