Xdebug 远程调试,你会用吗?

前言

在开发过程当中,咱们最少不了的就是调试,由于 php 不能像 Java 和 C# 那样与生俱来的优点,拥有开箱即用的断点调试,不少时候咱们的开发者都是使用的 var_dump 方法来对结果进行输出,而有的时候须要查看调用栈时,有的开发者甚至都不知道如和下手。(能够 throw 异常 或者 使用 debug_print_backtracedebug_backtrace 来打印调用栈),虽然不少开发者知道xdebug 可是也会由于其繁琐的安装望而却步,又或许你在本地高高兴兴搭建好了,有时候要调试一下外网的,好比测试服务器,你会发现这是个坑,不少文章都没有正确的引导你去如何的安装它。php

服务器如何安装 Xdebug

环境准备

  • ubuntu 16.04
  • php 7+
  • XShell

首先打开 Xdebug 官网nginx

是否是看到硕大的 Download 连接吸引到了你,若是你知道你的 php 是什么版本 你能够在这里愉快的下载,而后并安装。git

偶,我凑,怎么全是 Windows 的,Linux 的呢?Linux 固然是要从源码构建啦。web

我凑,不会?不要紧我们一块儿来学一学,首先新建一个 php 文件,若是你是用包管理器安装的那么请直接跳转到包管理器chrome

// info.php
<?php
phpinfo();

而后放到你的 web 目录,看清楚,必定是 web 目录。不要以为你耍小聪明,使用 php -S 来启动一个临时的 web 服务器,不容许,由于你这样用到的 php.inicli 的,而不是 fpm 的,当 phpinfo 信息显示出来。shell

而后咱们回到官网,点击下载页面的 custom installation instructions.ubuntu

来到这个页面后看到一个输入框,可是什么意思呢?vim

duang,翻译一下。服务器

这一下明白了吧,就是把 phpinfo 的完整输出复制到这个框框里面,而后提交,这下咱们回到 phpinfo 页面, Ctrl + A , Ctrl + C ,一鼓作气,过来粘贴提交。cookie

是的,没错,每一步该干什么它全都告诉你了,你只须要根据上面提供的 Ctrl+Insert(复制) ,Shift + Insert (粘贴),执行就完事儿。

第 9 步 直接用 vim 打开 php.ini 在最后加入那一行便可。

如今 ,在命令行执行

php -m

看到最后面有 XDebug ,别着急,这才成功了一半。
固然,到这里我还要告诉你一个很差的消息,哈哈。
若是你的 php 不是手动编译的,而是经过 包管理器(apt),由于 ubuntu 16.04默认的安装源 安装的是7.0 ,没有更高级的版本,你须要用 PPA 源来下载最新的 php 。固然,这里咱们就不在讨论了。

包管理器

若是你是使用的 apt 或者 apt-get 安装的,那么你能够经过 apt search xdebug 命令来查找 apt 中有关 xdebug 的包。

你可能会看到这个东西,没错,直接复制名字执行。

apt install php-xdebug

而后这时候,你去执行 php -m 就会发现 Xdebug 已经安装好了。

宝塔面板

若是你是宝塔面板的用户,你能够在面板的软件管理,对你须要操做的php版本中能够找到有直接安装 xdebug 扩展的位置。

接下来

无论你是包管理器 仍是 手动编译 安装的,这里的内容都须要看了。

打开 fpm 的 php.ini ,若是你是 宝塔面板 用户,你能够在宝塔的在线编辑,也能够根据 phpinfo 中的 路径直接编辑, 在 php.ini 最后面加入。

; 这个是节点名字 无所谓大小写
[XDebug]
; 容许远程 能够为 On 或者 1 都表示启用 , Off 和 0 表示关闭关闭
xdebug.remote_enable = 1
; 远程主机的 IP 这里咱们填写,固定的 127.0.0.1 
xdebug.remote_host = 127.0.0.1
; 调试链接端口 请记住这个端口,后续会用到。此配置项默认值为 9000 ,可是一般 9000 端口被 fpm 占据 ,故更换端口。
; 另外,请在你服务器的控制面板和服务器防火墙中开放这个端口的进出站。
; 若是你是宝塔面板用户 请放行此端口。
xdebug.remote_port = 19000
; 接下来的值都是可选的,可是我推荐你使用
; 链接 IDE 的 Key,请记住他,能够本身自定义,主要用来过滤请求。
xdebug.idekey=PHPSTORM
; 这个表示扩展的位置,若是你是编译安装的,那么这个值你应该在第九步已经设置好了,若是你是 使用 包管理器安装的,那么这个值应该是自动设置的,并且你不会在这个 php.ini 中找到他,可是此时你已经不用设置它了。
; 若是你是宝塔的用户,你会发如今你编辑这个文件以前,宝塔已经帮你设置好了
; 另外,一般我建议你将路径使用引号包裹起来,由于当路径中有特殊字符或者空格时会出现问题

; zend_extension=php_xdebug.dll

好了,保存完成后,咱们须要重启 fpm

service php7.0-fpm restart

由于个人 php 版本是 7.0 因此上面的命令是这样,若是你的不是,请根据实际状况来定。
若是你是宝塔面板的用户,请直接在面板操做。
若是你是本身编译的改了服务名字,不记得了,请执行

service --status-all

这将会打印出全部的服务(有可能会很慢),你能够在其中慢慢找。

当你准备好了以后,咱们回到咱们的开发端,打开 PHP Storm

客户端

使用 PHP Storm 打开你的项目。

看到右上角的调试面板,而后选择这个按钮,而后进去添加。

请根据图片提示

emm,过滤请求那个框一时找不到,就描述一下吧,当咱们有开启多个 PHP Storm 窗口时,若是有一个以上的 窗口都启用的 Xdebug ,那么,IDE 此时将会不知道该调用哪个而发生矛盾,你能够在弹出的窗口中选择使用哪个项目。

还有,当你经过 APP 请求时,你可能也不须要去过滤,故也不须要去勾选它,使用更加宽松的调试。

刚刚图上既然说到的了 mappings ,可是我通常都不会去启用它,但愿你也用不到。

不知道呢是否还记得,刚刚在修改 php.ini 时,我让你记住的那个 IDE Key,如今你能够用到它了。

接下来,咱们还要去修改另一个 配置,本地的调试端口。

按下 Ctrl+Alt+S 打开设置界面,或者在 左上角 File > Settings 而且定位到

Languages & Frameworks > PHP > Debug

当你设置好这个端口后,请记住它,接下来就会用到。

偶,好像最后一个标注错误,最后一个是,当在项目外时,在第一行断点。

这个才是在首行进行断点。

设置到这里,你是否是以为应该OK了?固然,不是,是否记得刚刚在 准备工具 中提到的 Xshell 和 在 php.ini 中设置的 端口没有使用。

Xshell 设置

请确保在你的 Xshell 左侧的 会话管理器 中已经添加了你的服务器链接。

图片中虽然已经对大部份内容进行了模糊处理,毕竟是外网服务器,若有遗漏之处,也请不要对其进行恶意请求,谢谢。

点开属性,依次选择 链接 >SSH>隧道 > 添加

请参考图片进行操做

若是隧道转发没有成功该怎么办?

  • 查看本地端口的使用是否正确。

打开命令行,执行以下命令,其中 9001 是在 PHP Storm 中设置的端口。

# 找到 PID
netstat -aon | findstr 9001
# 经过 PID 找到 是谁在使用。
tasklist | findstr {PID}
# 结束进程 若是这端口被占用 可使用以下命令结束,固然,我更加推荐你换个端口。
taskkill /PID {PID}

若是本地正常,那么问题就应该在服务器。

在服务端执行以下命令,19000 为 服务器设置的端口。

lsof -i:19000

此时,若是隧道未链接,那么这个端口是不该该被占用的,反之则显示为一个 SSHD,若是不为空,那么就是端口被其余程序占用了,我建议你换个端口。

最后一线

当以上步骤都完成后,咱们就能够来进行测试了吗?不是的,还有一步,代码同步 ,这是很是重要的一步。

代码同步

顾名思义,代码同步,须要你本地的代码和线上的代码一致。为了在调试时追踪跳转文件,避免因文件没法映射而致使没法同步。

通常状况下,咱们都是使用 git 来进行代码托管,直接从 git 上拉取代码便可,这样就能确保咱们的代码是同步的,如今咱们就能够 happy 的进行调试代码了,可是当你直接访问你却发现,IDE 并无拦截你的请求,是否是很尴尬。

启用调试

如图上所说,其实这种状况下咱们也能够正常进行调试。

当咱们直接访问,却发现 PHP Storm 并无捕获到咱们的请求这是为何?

缘由很简单,咱们没有告诉 Xdebug 咱们要关心这个请求,不然试想一下,有几我的同时请求你的网页,所有被 IDE 接收了,是否是疯了?

这时候,咱们只须要在 URL 后面加上 XDEBUG_SESSION_START=233 首先 ,这个 XDEBUG_SESSION_START 是必须的,可是他的值是能够随便填写的。
此时 URL 变成了,参考文档

https://xxx.com?XDEBUG_SESSION_START=233

就能够正常捕获了。

若是你以为手动添加,很麻烦,那你还能够安装一个 Chrome 插件。

Xdebug helper - Chrome 网上应用店

这个工具会自动帮你设置,只不过他是在 cookie 里面设置,依赖cookie。

安装完成后,须要先配置,右键扩展栏的虫子图标,选择选项

选择 PHP Storm, 固然,别忘了旁边的 Save

常见问题

没法断点

  • 确认服务器端口在隧道连通后,是 SSHD 在使用那一个端口。
  • 确认服务器端口在防火墙以及服务器面板放行了端口。
  • 确认本地端口是被 phpstorm 所使用的。
  • 确认 XShell 隧道链接是成功状态。
  • 确认 PHP Storm 中的 电话 图标是绿色,而且正确配置了调试服务器。

本地没法跳转

这个主要是表如今 使用追踪时,忽然就跳出了循环,明明下面还有断点,这是由于一些项目中使用了 自定义一些复杂的表达式来引入文件,致使无法映射致使,好比 微擎 。这时候就须要单步骤调试,到出错的位置,Xdebug 的 Debugger 窗格会为咱们提示。

手动添加映射

clipboard.png

也能够直接在上级目录,为整个目录添加映射。

映射添加完成后,就能够以继续调试了

可是要注意路径对应不然会影响调试。

调试自动断开 nginx 返回 504

这是由于你没有调整 PHP 和 FPM 以及 Nginx 的最大执行时间,修改到一个较大的值便可。

宝塔面板问题

宝塔面板的用户你会发现你网页端使用的 php 版本和 cli 的版本不一致,能够打开

网站 > PHP 命令行版本(就在添加网站那一排的最后一个按钮)

而后再进入

软件商店 > 对应的 php 版本 > 设置 > 安装扩展 > 选择 Xdebug

顺便还能够把超时这些也在这里修改了 解决上面的 504 问题

当安装完 Xdebug 后,切换到 服务 而后选择 「重启」 必定是 重启 而不是 重载配置

而后点击下面的 > phpinfo > 查看 phpinfo 。这时候你就能看到了,而后能够搜索 xdebug 验证是否安装成功。

接着 去修改 php.ini ,配置咱们方才 提到的

注意

  • 不能用于 Swoole
  • 不能用于 Workerman
  • 理论上相似框架都不能,不过实践出真理
  • 理论上只能同时一台物理机对应一台服务器进行调试,由于 xshell 隧道占用。固然 你能够多启动 fpm 使用不一样的 php.ini 文件(理论可行)。

使用 Xdebug

图例:

  • 一、Debug 窗口 在启动 debug 时 该窗口会自动打开
  • 二、跳转到下一个断点
  • 三、暂停执行
  • 四、结束脚本执行
  • 五、查看全部断点
  • 六、屏蔽全部断点
  • 七、逐行执行代码
  • 八、进入方法或文件
  • 九、强制进入方法或文件
  • 十、跳出方法或文件
  • 10和11中间 ,运行到光标所在行,若是期间有断点会优先执行断点
  • 十一、执行表达式
  • 十二、Debugger 窗体,能够查看执行的调用栈,查看/修改运行时环境,变量。
  • 1三、Console 窗体,能够执行命令
  • 1四、脚本结果窗体

这些都是有快捷键的,能够把鼠标放上去看,能够参考官方手册

结束

曾经由于在远程调试走了不少弯路,至此就专门去研究这个,通过屡次的实践和应用,稳定了次方案进行安装,故发出来,也但愿对你有所帮助。

当你习惯了使用 Xdebug 调试,或许你之后都再也不想用 var_dump 了。

参考资料

相关文章
相关标签/搜索