游客发表
PHP调试最笨的试工办法就是到处插var_dump()和die(),我见过不少项目里还留着这种东西,试工上线前忘了删,试工结果页面上直接打印出数据库密码。试工这事真不能怪开发者懒,试工而是试工很多人压根没花时间了解过PHP生态里到底有哪些趁手的调试工具。
先聊最基础但也最容易被忽视的试工——错误报告。PHP本身的试工错误显示机制其实够用,前提是试工你得把它打开。开发环境里php.ini里那几个配置项:display_errors = On、试工error_reporting = E_ALL,试工再配合log_errors = On把错误写进日志文件。试工很多人抱怨PHP调试难,试工一问配置,试工display_errors是试工关的,错误全被吞了,那当然难。我自己的习惯是在项目入口文件顶部加一段环境判断,开发环境强制打开所有错误显示,生产环境全部关掉只写日志。这段代码也就三行,但能省掉大量“为什么页面空白”的排查时间。
再往上走一层,Xdebug是绕不开的。这东西装了之后,var_dump()的输出会变得极其舒服——有颜色、有类型、有文件行号、有对象结构折叠。你甚至不用改代码,Xdebug会自动接管输出格式。但Xdebug真正值钱的地方是断点调试。配合VS Code的PHP Debug插件,在编辑器里点个红点,浏览器刷新页面,代码就停在断点处,你可以逐行执行、查看任意变量的值、修改变量再继续跑。我第一次用这个功能的时候,感觉之前用echo调试的那些年都白活了。
不过Xdebug有个老问题:性能开销大。它挂在PHP进程上,每次请求都要处理调试信息。所以生产环境绝对不能开Xdebug,开发环境如果觉得卡,可以配xdebug.mode=debug只开调试模式,关掉coverage和develop模式。
如果你不想装扩展,或者用的是共享主机没法改配置,那还有一类纯PHP实现的调试工具。比如symfony/var-dumper这个包,通过Composer装完,用dump()函数代替var_dump(),输出效果比Xdebug还漂亮。它会把输出渲染成一个可折叠的HTML结构,数组和对象层级一目了然。更妙的是它支持dump()之后继续执行,不像die()那样直接中断。你可以在一个方法里连续dump()好几个变量,页面底部会依次列出所有输出,互不干扰。
日志工具也值得说一嘴。Monolog是PHP里最流行的日志库,Laravel、Symfony都默认用它。它的价值在于你可以把不同级别的日志写到不同地方——调试信息写文件、错误发邮件、关键业务操作写数据库。调试的时候,与其在代码里到处插输出,不如在关键路径上打日志,然后tail -f盯着日志文件看。这种方式对线上环境尤其友好,因为你可以动态调整日志级别,不用改代码就能拿到更多信息。
还有一个场景很多人会遇到:API调试。你写了个接口,前端说返回不对,你也不知道是请求参数的问题还是逻辑的问题。这时候Postman或者curl只能看到最终输出,看不到中间过程。我的做法是在框架的中间件里加一段调试日志,把请求头、请求体、响应体全记下来,配合一个请求ID串联整条链路。这样前端报问题的时候,直接拿请求ID去日志里搜,整条请求的生命周期一目了然。
工具多了容易挑花眼。我的建议是:本地开发用Xdebug加symfony/var-dumper,线上排查靠日志加请求追踪。别在调试工具上追求大而全,能把一个用透就够解决九成问题。
友情链接