原文:https://laravel-china.org/articles/4098/the-first-step-to-becoming-a-senior-php-programmer-debug-xdebug-configuration?order_by=vote_count&
先简单说一下在我们的 Homestead 中,xdebug 的简单配置。(安装就不在此展开了)
打开配置文件,(我的环境是7.1,下面都是以此版本配置,其他版本相同) /etc/php/7.1/mods-available/xdebug.ini
# 必填项
zend_extension=xdebug.so
xdebug.remote_enable = 1
xdebug.idekey = PHPSTORM (这个值是作为 XDEBUG_SESSION_START 的值,是通知 PHP 开启调试的标识)
# 可选项
xdebug.remote_connect_back = 1 (如原理篇介绍的,如果开启,将会忽视 remote_host 的配置,以请求来源的 IP 作为 xdebug 响应的 IP)
xdebug.remote_log="/tmp/xdebug_php71.log" (记录日志)
#xdebug.remote_autostart = 1 (如果开启,则无论什么请求都会进行调试响应)
# 默认的 remote_host 和 remote_port 如果不做更改可以省略
简单的配置完成后,我们需要给 PHP 开启一下这个模块。
TIPS : 我们知道,PHP 有两种运行模式
FPM
和CLI
,想要开启模块有一个实用的命令sudo phpenmod -s fpm [ -v 7.1 ] xdebug
。这样就会开启PHP-FPM
的 xdebug 模块,而不会影响CLI
。这个命令还有一些其他参数,比如-v
可以指定 PHP 的版本
开启模块后,重启一下服务:
sudo service php-fpm restart
至此,Homestead 的所有配置就全部完成啦,是不是很简单!
其实针对 xdebug 有两种调试模式,针对单个 PHP 文件
和针对整个PHP项目
,这里我们分开来说,也容易理解我们做的配置具体针对那部分生效
想要调试 PHP 我们首先需要 开启 xdebug 对 PHP 程序,这里我们使用 Homestead 中的 PHP。
如图所示,我们增加一个 CLI Interpreter
这里我使用的方式是通过 SSH,注意红框处,表示 PHP-CLI
模式也已经开启了 xdebug 模块,如果没有开启我们需要开启一下,还是上面说到的那个命令 sudo phpenmod -s cli xdebug
配置完成后,我们配置使用一下这个 CLI Interpreter
,注意红框,必须配置目录映射,至于原因下文说
到这里,针对单文件调试的配置就算做完啦!我们调试一个文件试试!
下面说的配置和上面配置可以说没有任何关系啦,大家可以忘掉刚才配置的事儿,继续下一个。和调试单个文件不同的是,针对整个项目调试,需要我们先配置一个 server
。同样的,一定要配置目录映射
保存后,我们的配置可以说就完啦!(不过为了调试的方便,我们增加一个其他的配置,这个稍后讲。)
打断一下,不知道大家发现没有,不管针对
单个文件
还是针对整个项目
的配置,都有一个For current project
的字样。没错,这些配置只会对当前项目生效,如果再打开一个新项目,这些配置是需要重新配置的!(不过已经配置的项目是会保留的)
我们请求项目测试之前,先打上几个断点,要不是看不到效果的:
如昨天原理说的,访问之前我们还需要开启一下 9000 端口
的监听,打开菜单栏
开启后,现在我们打开浏览器,访问项目当前打过断点的路由。记得加我们的调试标识
这时我们的 phpstorm 应该会蹦出一个调试栏,和许多调试信息
如果没有弹出调试栏,但是浏览器一直在转圈,没有输出结果,百分之百是因为调试栏当中有其他调试的
tab
,这就需要我们手动打开调试栏全部关掉!
到这里,其实我们的配置已经完成了,已经可以进行远端调试了。但是刚才说的未完全的配置还有什么?
还是我们的 菜单栏 > Run > Edit Configurations
这里我们增加一个 PHP Web Application 类型的项目,配置如图。这个配置有什么用呢?配置完这个后,当我们在 IDE 点击 菜单栏 > Run > Debug
的时候,会弹出下面的框
我们选择刚才配置的xdebug-myblog
,这时就会在浏览器开启一个带 debug 标示
的项目链接,不用我们手动输入链接了
xdebug helper
他的工作原理是,设置一个cookie,如下图所示。(XDEBUG_SESSION_START
支持 get
、post
和cookie
三种方式告诉 PHP 开启调试)
2 . 为什么一定要设置目录映射?
我的理解是,无论那种调试模式,实际上运行的都是 Homestead 中的项目和文件,所以开启映射就相当于给 Homestead 中的项目打断点,和 PHP 执行的文件就统一了!这样才能成功。这里有一个回答,我觉得和我理解的是一个意思 Remote debugging path mapping
其实 xdebug 不仅能调试,也可以作为 Profile 和 Trace 工具,当然,@MrJing 说的追踪项目源码也是一个利器