学习起因:新人学YII2不知道远程调试(远程调试和控制台调试是两件事,同一个原理)
因为yii2框架,设计复杂度非常高,加上php代码的弱类型语言结构,在代码非常复杂的情况下,不采用调试的方式来看源码调用栈,几乎是灾难性的,所以我们必须解决phpstorm下的远程调试问题。
远程调试原理图:
涉及技术:
docker下安装php,xdebug的远程配置,phpstorm的远程配置
为何没选用php5.6版本演示调试:
因公司的php代码采用的是php5.6版本,又加上公司的代码的数据库,es等很多模块无法在本地进行直接连接,这些问题,造成没有现成的yii2 5.6版本可供调试,我手头的yii2全部都是基于php7.2的,所以后期可能要降级处理一下,给一个案例yii2 5.6版本,但是理论上php5.6版本和php7.2版本除了xdebug的配置有所不同外,其他流程应该毫无差别:
xdebug 不同版本配置差别:
-
xdebug3.0以下版本(php5.6采用的必须是xdebug2.5版本,这个要手动安装,下面会给出详细安装方式)
[xdebug]
zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_host=docker.for.mac.host.internal
xdebug.remote_port=9000
-
xdebug3.0以上
[xdebug]
zend_extension=xdebug.so
xdebug.mode=develop, debug
xdebug.client_port=9003 #也可以是9000 这个随意配置 保证phpstorm监听这个端口即可
xdebug.client_host=docker.for.mac.host.internal #docker容器访问宿主机host
xdebug.trace_output_dir=/tmp/xdebug #可以删除,跟踪日志也没有必要加上
xdebug.profiler_output_dir = /tmp/xdebug #可以删除,profiler是个分析器会
#产生大量的分析日志垃圾,不会清理的,尽可能别开启
xdebug.profiler_enable = On #可以删除
xdebug.profiler_enable_trigger = 1 #可以删除
mac m1 如何安装docker 并安装所需要的php环境?
请参考:mac m1 安装docker docker 安装php 5.6 和 7.2 避坑指南_森叶的博客-CSDN博客
我这里的生成docker容器的脚本也分享这里:
docker run -dit --name=php72 --platform linux/amd64 --privileged -p 2022:22 -p 8083:880 -p 9501:9501 -v /Users/senwang/workspace:/home c13a516c5bea /usr/sbin/init
大家这里最好,将8083:880 直接改为80:80 这样就不用输入端口号,就不用被端口号影响思路了,但80端口经常被各种服务直接占用,记得要先干掉其他占用的80端口的服务,9000端口也经常被占用哦!
docker run -dit --platform linux/amd64 --privileged -p 2022:22 -p 8083:80 -p 9505:9501 --name=php72 -v /Users/senwang/workspace:/home 8ef27e80b336 /usr/sbin/init
这里以php7.2为例子讲解:xdebug在lnmp时默认安装即可,默认安装的xdebug3.0版本了
如果是php5.6,参考安装教程,lnmp已经无法自动帮助php5.6安装xdebug了,所以要自己手动进行编译安装xdebug2.5.4
下载xdebug2.5.4源码链接:GitHub - xdebug/xdebug at xdebug_2_7直接下载zpi包,这样就不用切git 分支了
装完之后到php.d修改配置文件:
cd /usr/local/php/etc/php.d/
vim 08-xdebug.ini #添加下面的配置文件
[xdebug]
zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_host=docker.for.mac.host.internal
xdebug.remote_port=9000
phpstorm怎么配置:
这个配置好后,还要宿主机hosts设置一下:sudo vim /etc/hosts
这样你在浏览器中访问该域名时,就会直接访问本机了,加上8083,就会自动转发到容器里面去了。
phpstorm中代码库的顶部要加上这样一个cookie
没这个cookie不能直接触发远程监听,有了这个cookie,phpstorm才知道这个请求是要调试的
一切就绪,找到具体路径打个断点:就可以愉快的调试了
补充cli环境调试:
刚才提到cli控制台调试,所谓控制台,就是不通过访问url来触发,而是手动右键debug的方式,这时要配置php远程解释器:
额外配置参数:
#xdebug3.0配置
-dxdebug.client_host=docker.for.mac.host.internal
#xdebug3.0以下配置
-dxdebug.remote_host=docker.for.mac.host.internal