成为高级 PHP 程序员的第一步——调试(xdebug 配置篇)

世界上最崩溃的事就是,在你快文章收尾的时候,浏览器因为意外关闭导致前功尽弃

社区的缓存功能好像对我这次没起作用,哎,再来一次吧,真是瞬间泄气的感觉!!!:joy:

分割线


上一篇 成为高级 PHP 程序员的第一步——调试(xdebug 原理篇),介绍了一下 xdebug 工作原理,明白了工作原理,对我们接下来的配置应该就是信手拈来,就算第一次没成功,也会很快定位到问题。(好像任何事情好像都是这个道理 :joy: )

xdebug 配置

先简单说一下在我们的 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 有两种运行模式 FPMCLI,想要开启模块有一个实用的命令 sudo phpenmod -s fpm [ -v 7.1 ] xdebug。这样就会开启 PHP-FPM 的 xdebug 模块,而不会影响 CLI 。这个命令还有一些其他参数,比如 -v 可以指定 PHP 的版本

开启模块后,重启一下服务:

sudo service php-fpm restart

至此,Homestead 的所有配置就全部完成啦,是不是很简单!

PHPSTORM 配置

其实针对 xdebug 有两种调试模式,针对单个 PHP 文件和针对整个PHP项目,这里我们分开来说,也容易理解我们做的配置具体针对那部分生效

针对单个 PHP 文件调试配置

想要调试 PHP 我们首先需要 开启 xdebug 对 PHP 程序,这里我们使用 Homestead 中的 PHP。

如图所示,我们增加一个 CLI Interpreter
file

这里我使用的方式是通过 SSH,注意红框处,表示 PHP-CLI 模式也已经开启了 xdebug 模块,如果没有开启我们需要开启一下,还是上面说到的那个命令 sudo phpenmod -s cli xdebug
file

配置完成后,我们配置使用一下这个 CLI Interpreter,注意红框,必须配置目录映射,至于原因下文说
file

到这里,针对单文件调试的配置就算做完啦!我们调试一个文件试试!
file

针对整个项目的配置

下面说的配置和上面配置可以说没有任何关系啦,大家可以忘掉刚才配置的事儿,继续下一个。和调试单个文件不同的是,针对整个项目调试,需要我们先配置一个 server。同样的,一定要配置目录映射
file

保存后,我们的配置可以说就完啦!(不过为了调试的方便,我们增加一个其他的配置,这个稍后讲。)

打断一下,不知道大家发现没有,不管针对单个文件还是针对整个项目的配置,都有一个For current project 的字样。没错,这些配置只会对当前项目生效,如果再打开一个新项目,这些配置是需要重新配置的!(不过已经配置的项目是会保留的)

我们请求项目测试之前,先打上几个断点,要不是看不到效果的:
file

如昨天原理说的,访问之前我们还需要开启一下 9000 端口 的监听,打开菜单栏
file

开启后,现在我们打开浏览器,访问项目当前打过断点的路由。记得加我们的调试标识
file

这时我们的 phpstorm 应该会蹦出一个调试栏,和许多调试信息
file

如果没有弹出调试栏,但是浏览器一直在转圈,没有输出结果,百分之百是因为调试栏当中有其他调试的 tab,这就需要我们手动打开调试栏全部关掉!

到这里,其实我们的配置已经完成了,已经可以进行远端调试了。但是刚才说的未完全的配置还有什么?
还是我们的 菜单栏 > Run > Edit Configurations
file

这里我们增加一个 PHP Web Application 类型的项目,配置如图。这个配置有什么用呢?配置完这个后,当我们在 IDE 点击 菜单栏 > Run > Debug 的时候,会弹出下面的框
file
我们选择刚才配置的xdebug-myblog,这时就会在浏览器开启一个带 debug 标示的项目链接,不用我们手动输入链接了

TIPS

  1. 每次需要调试都需要手动写那个参数太麻烦了怎么办?
    已经有人帮你想好啦,chrome 可以安装一个插件xdebug helper
    file
    开启这个插件后,我们的链接不用加那个参数也可以调试了!
    file

他的工作原理是,设置一个cookie,如下图所示。(XDEBUG_SESSION_START 支持 getpostcookie 三种方式告诉 PHP 开启调试)
file

2 . 为什么一定要设置目录映射?
我的理解是,无论那种调试模式,实际上运行的都是 Homestead 中的项目和文件,所以开启映射就相当于给 Homestead 中的项目打断点,和 PHP 执行的文件就统一了!这样才能成功。这里有一个回答,我觉得和我理解的是一个意思 Remote debugging path mapping

其实 xdebug 不仅能调试,也可以作为 Profile 和 Trace 工具,当然,@MrJing 说的追踪项目源码也是一个利器!最后祝大家能早日成为"高级程序员",笔芯 :joy:

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 7年前 加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 36

我来个沙发,哈哈

7年前 评论

@to2False :kissing_closed_eyes:,话说那个MacGDBp 还可以,清晰、简洁。sublime 感觉还是不太好

7年前 评论

大赞啊:smile:

7年前 评论

@张小张 感觉有用就不白写啦 :smile:

7年前 评论

左侧绿色三角形 : Resume Program,表示將继续执行,直到下一个中断点停止。
左侧红色方形 : Stop,表示中断当前程序调试。
上方第一个图形示 : Step Over,跳过当前函数。
上方第二个图形示 : Step Into,进入当前函数內部的程序(相当于观察程序一步一步执行)。
上方第三个图形示 : Force Step Into,強制进入当前函数內部的程序。
上方第四个图形示 : Step Out,跳出当前函数內部的程式。
上方第五个图形示 : Run to Cursor,定位到当前光标。
Variables : 可以观察到所有全局变量、当前局部变量的数值
Watches : 可以新增变量,观察变量随着程序执行的变化。

7年前 评论

图没拖进来。。。

7年前 评论

phpstrom + xdebug 棒棒哒

7年前 评论
幽弥狂

为嘛composer报错呢?提示不能和xdebug一起玩耍。。。

7年前 评论

@xhh110 我这里没提示报错,以前我记得因为性能的原因,使用 composer 的时候会建议关闭 CLI 模式的 xdebug 模块。其实调试的话,单个脚本调试的情况应该比较少,所以只开启 FPM 的 xdebug 模块就够啦,这样也不影响 composer 的使用

7年前 评论
ninja 2年前

xdebug 好东西啊!什么时候能出个 homestead + sublime 上的教程呢?

7年前 评论

@SpiderEvgn 原理都一样,不过在 sublime 上调试不是很方便。@to2False 推荐了一个工具 MacGDBp 可以替代 sublime 中集成的 xdebug client

7年前 评论

楼主 phpstrom 什么版本

6年前 评论

postman 过来的请求都没触发 debug. 有碰到这个问题的道友么?

6年前 评论

@lazyou
已解决: https://delboy1978uk.wordpress.com/2015/05...

postman 请求的时候加上 cookie XDEBUG_SESSION=PHPSTORM.

6年前 评论

推荐一篇PhpStorm + WAMP下Xdebug的搭建https://wayearn.com/2016/02/php%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%EF%BC%9Aphpstorm-xdebug-wamp/

6年前 评论
Luff

问下这个是什么原因,怎么解决呀?

file

就是连不上 Homestead, 我是在重新生成了 ssh key 后出现的这个问题,开始是可以连上的。

6年前 评论

成功安装,灰常感谢

6年前 评论

windows系统看起来有些不同,废了些功夫,终于搞定。。。

5年前 评论

phptorm 设置断点没有作用,调试的时候直接跳过断点,到底怎么回事?

下面是我的调试步骤

  1. 开启监听Xdebug, Run->Start Listening for PHP Debug Connections。
  2. 打一个断点

file

  1. 点击 Postman Send 按钮
  2. 此时 PHPstorm中 debug 定位到 laravel 的 index.php

file

  1. 此时点击下面的按钮

file

  1. 直接越过断点跳到

file

5年前 评论

【问题补充】之前能在指定断点处停止,莫名其妙,就不能了,你们遇到相同情况吗?

5年前 评论

@theDog 遇到了同样的问题 折腾了好久 未解决 去掉xdebug.remote_connect_back = 1 连index.php都进不了了。

5年前 评论

我用phpstorm + xdebug php5.6 版本都可以,但php7.0以上版本都没办法成功,xdebug版本确定是和php版本一致的,直接是用xdebug官网那个输入php版本信息获取xdebug的方式下载的,安装后在php的扩展中也看到了,但不知道什么原因,php7.0以上就是不行,总是提示
Debug session was finished without being paused
It may be caused by path mappings misconfiguration or not synchronized local and remote projects.
To figure out the problem check path mappings configuration for 'ai.com' server at PHP|Servers or enable Break at first line in PHP scripts option (from Run menu).
Do not show again

4年前 评论

vagrant + PHP7.3 + phpstorm + chrome / postman 设置成功, 感谢楼主!

4年前 评论

file
一直报这个错误,求大神帮忙看下。

4年前 评论
lzw123 4年前

file
请帮忙看下我的怎么没有远程的 CLI Interpreter

4年前 评论

请问调试接口时怎么自动加xdebug...参数呢

3年前 评论

Failed to restart php-fpm.service: Unit php-fpm.service not found.
这个报错怎么解决,百度不到

2年前 评论

问下,这个也适用虚拟机环境吗

2年前 评论

请问一下大佬,在 homestead 用 sudo phpenmod -s cli [ -v 7.1 ] xdebug 打开了 Xdebug 模块后,用什么命令可以关掉?

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!