前言在开发的过程中,我们最起码能做的就是调试,因为php不能像Java和C#那样具有先天的优势,并且具有开箱即用的断点调试。很多时候我们的开发人员使用var_dump方法来输出结果,而有时候需要查看调用堆栈的时候,有些开发人员甚至都不知道如何下手。(可以抛出异常或者使用debug_print_backtrace和debug_backtrace来打印调用栈),虽然很多开发者都知道xdebug,但是也对其繁琐的安装望而却步,又或者你乐于在本地构建,有时需要调试外网是的,比如测试服务器,你会发现这是一个坑,很多文章并没有指导你如何正确安装。注意:启用Xdebug会导致您的代码运行速度变慢。在Windows10+IIS(FastCGI)上,原来的500ms响应时间变成了2500ms。为了更好的开发体验,请尝试仅在需要时启用Xdebug,或关闭自动启动Xdebug。如何在服务器上安装Xdebug环境准备ubuntu16.04php7+XShell首先打开Xdebug官网。看到吸引你的巨大下载链接了吗?如果你知道你的php是什么版本,可以在这里愉快的下载,然后安装。甚至,让我想想,为什么都是Windows和Linux?Linux当然是从源代码构建的。我愿意,你愿意吗?没关系,我们一起学习,先新建一个php文件,如果你用包管理器安装的,请直接跳转到包管理器//info.php设置并导航到语言和框架>PHP>调试。设置好这个端口后,请记住,以后会用到。甚至,好像最后一个标签是错误的,最后一个是,在项目外的时候,在第一行就断了。这是第一行的断点。设置到这里后,大家觉得应该可以了吧?当然不是,记住准备工具中提到的Xshell和php.ini中设置的端口都没有用到。Xshell设置请确保您的服务器连接已添加到您的Xshell左侧的会话管理器中。虽然图片中的大部分内容已经模糊,但毕竟是外部服务器。如有遗漏,请勿恶意索取,谢谢。点击属性,选择Connection>SSH>Tunnel>Add,如图操作,隧道转发不成功怎么办?检查本地端口是否使用正确。打开命令行,执行以下命令,其中9001为PHPStorm中设置的端口。#查找PIDnetstat-aon|findstr9001#通过PID查找谁在使用它。任务清单|findstr{PID}#结束进程如果这个端口被占用,可以使用下面的命令结束。当然,我建议您更改端口。taskkill/PID{PID}如果它在本地有效,那么问题应该在服务器上。在服务器上执行以下命令,19000是为服务器设置的端口。lsof-i:19000这时候如果没有连接隧道,那么这个端口应该不会被占用,否则会显示为SSHD,如果不为空,那么这个端口被其他程序占用了,我建议你改变端口。最后一行当上面的步骤完成后,我们就可以来测试了吗?这不,还有一步,代码同步,这是非常重要的一步。代码同步顾名思义,代码同步就是要求你本地的代码和线上的代码保持一致。为了在调试时跟踪跳转文件,避免因为未映射文件导致同步失败。一般情况下,我们使用git进行代码托管,直接从git中拉取代码即可,这样可以保证我们的代码是同步的,现在我们可以愉快的调试代码了,但是当你直接访问你的时候是不是很尴尬但是发现IDE没有拦截你的请求。如图所示启用调试,其实这种情况下我们也可以正常调试。当我们直接访问时,发现PHPStorm并没有捕获到我们的请求。为什么?原因很简单,我们没有告诉Xdebug我们应该关心这个请求,否则试想一下,几个人同时请求你的网页,都被IDE接受了,这不是疯了吗?这个时候我们只需要在URL后面加上XDEBUG_SESSION_START=233即可。首先这个XDEBUG_SESSION_START是必须的,但是它的值可以随便填。此时网址已经改变,可以正常抓取参考文档https://xxx.com?XDEBUG_SESSION_START=233。如果觉得手动添加麻烦,也可以安装Chrome扩展。Xdebughelper-ChromeWebStore中的这个工具会自动为你设置它,但它是在cookie中设置的,并且依赖于cookie。安装完成后,需要先进行配置,右击扩展栏中的bug图标,选择Options。选择PHPStorm,当然不要忘记Save旁边的FAQ不能断,确认服务器端口是连接隧道的,SSHD使用的是哪个端口。确认在防火墙和服务器面板上放行了服务器端口。确保本地端口被phpstorm使用。确认XShell隧道连接成功。确认PHPStorm中的电话图标为绿色并且调试服务器已正确配置。本地不能跳转主要表现在使用tracking,突然跳出循环,明显下面有断点,这是因为有些项目使用自定义的复杂表达式导入文件,导致映射失败,比如Microengine.这时候就需要单步调试了。当错误发生时,Xdebug的Debugger面板会提示我们。手动添加映射也可以直接在上级目录下为整个目录添加映射。添加映射后,可以继续调试,但要注意路径对应关系,否则会影响调试。调试自动断开nginx,返回504,这是因为你没有调整PHP、FPM和Nginx的最大执行时间,修改为较大的值即可。宝塔面板问题对于宝塔面板的用户,你会发现你的网页使用的php版本与cli版本不一致。可以打开网站>PHP命令行版本(就是添加网站那一行最后一个按钮)然后进入软件商店>对应的php版本>设置>安装扩展>选择Xdebug,顺便也可以修改这里的timeout就是为了解决上面的504问题。安装Xdebug后,切换到Services并选择“Restart”,必须是Restart而不是ReloadConfiguration。然后单击>phpinfo>查看下面的phpinfo。这时候就可以看到了,然后可以搜索xdebug来验证是否安装成功。然后去修改php.ini,配置注意我们刚才说的不能用于Swoole不能用于Workerman理论上类似的框架是不行的,但实际调试只能同时一台物理机对应一台服务器理论上,因为xshell隧道被占用。当然你可以使用不同的php.ini文件来启动多个fpm(理论上是可能的)。使用Xdebug图例:1.启动调试时会自动打开Debug窗口2.跳转到下一个断点3.暂停执行4.结束脚本执行5.查看所有断点6.屏蔽所有断点7.逐行执行代码8、进入方法或文件9、强制进入方法或文件10、跳出方法或文件10、11,运行到光标所在行,如果期间有断点,则优先执行断点11,执行表达式12,在Debugger窗口,可以查看执行的调用栈,查看/修改运行环境,变量。13.控制台窗口,可以执行命令。14、脚本结果窗口有快捷键,鼠标放在上面可以看到,可以参考官方手册。最后,我在远程调试上走了很多弯路,目前一直致力于研究这个。经过多次实践和应用,我已经稳定了第二个方案的安装,所以发出来,希望对大家有所帮助。当您习惯使用Xdebug进行调试时,也许您不想再使用var_dump。参考Xdebug:DocumentationPhpStorm_ReferenceCard.pdf
