PHP调试总卡壳?3个新手忽略的断点技巧
|
上周三下午,机房空调又坏了,风扇声跟拖拉机过隧道似的,我蹲在U7机柜前盯PHP-FPM进程,后脖颈全是汗,左手还捏着半截冷掉的韭菜盒子——老陶站我斜后方啃苹果,咔嚓咔嚓,每一下都像在咬我神经。
文章配图,仅供参考 就那个弹窗埋点没测全的事。开发说“本地好得很”,甩来张截图,背景是Mac OS暗色模式,时间戳显示下午三点零七分,右下角还挂着VS Code状态栏小图标。我盯着那图看了十八秒,没说话。后来才知道他截图前清了缓存、关了Xdebug、手动补了$_SESSION里两个键——但这些他一句没提。我原以为只是环境差异,结果回滚时发现生产DB里有个字段被悄悄加了NOT NULL约束,测试库连表结构都没同步过。PHP调试总卡壳?3个新手忽略的断点技巧。这话听着像培训PPT标题,但我现在敢打包票:真有用。第一个是xdebug_break()硬塞进业务逻辑中间,不是靠IDE点——上周五凌晨两点,我就是把这行塞进vendor里的monolog-handler里,才揪出日志刷屏其实是上游HTTP client retry机制触发的二次调用;第二个是条件断点不写==而写===,上季度末我们漏掉的边界值是空字符串和null混用,IDE里设了个if($data == ''),结果$daa是null它也停;第三个最糙:直接在error_log里打桩+sleep(1),靠tail -f看执行流卡在哪,比任何step over都直白。这三个不是技巧,是活下来的人喘气的姿势。 老陶昨天还在测那个新订单页,测到第七遍突然问我:“你信不信,同一套自动化脚本,在Jenkins跑是绿的,在GitLab CI跑是红的,在我本地Docker里跑是黄的?”我没答。他手机响了,接起来“喂”了一声,就再没说话,低头戳屏幕——后来我才看见他钉钉消息框里弹出一句:“DBA刚改完从库权限,别连主库”。他手指悬在发送键上停了三十秒,最后把整段删了,换成一个句号。 优胜劣汰这事吧,不是淘汰人,是淘汰那种“觉得调试器该替你思考”的惯性。就像上周三我非要在docker-compose.yml里硬加xdebug.remote_host=host.docker.internal,折腾俩钟头才发现宿主机防火墙开了个白名单,只放行了192.168.99.0/24,而我的docker网络是172.23.0.0/16——这事儿我说不准,查IP段是运维老李扫了一眼路由表顺嘴提的,我至今没翻通Linux network namespace文档。但我知道,当断点打在foreach($items as $item)这一行却永远跳不进循环体时,八成不是代码问题,是你没意识到这个$item其实是Generator对象,而Xdebug默认不展开迭代器。 中午食堂阿姨多给了我一勺土豆丝,油亮亮的,搁在不锈钢餐盘边沿晃。她左手无名指有道旧疤,切菜时划的,每年冬天会裂口子。我就盯着那道疤想:咱们写的断言也是这样,表面完好,一遇生产流量就渗血。上回自动化用例里那个assertTrue(is_numeric($price)),看着多踏实,可真实数据里有个price是"¥199"——is_numeric返回false,但脚本照样绿,因为断言后面还跟了个echo "done"; 而CI配置里把stdout重定向到/dev/null,stderr又没配超时中断。没人看见那一行报错被吞了。 老陶今早发我个链接,是某个Golang项目里用//go:noinline标记函数防止内联优化的案例。我点了进去,发现底下评论区第三条写着:“PHP 8.2之后,jit_enabled=1时,opcache也会偷偷内联简单函数,所以xdebug_break()可能根本没机会触发。” 我把这条复制下来,粘贴进自己笔记本,删掉前半句,只留后半句。然后盯着看了两分钟,关了窗口。窗外开始下雨,雨点砸在机房通风口铁皮盖上,声音很碎,像有人在敲摩斯电码,但没人译得出来。 我打算明天在dev环境试一次:把所有vendor里关键类的__construct方法里都塞一行file_put_contents('/tmp/x.log', debug_backtrace()[0]['file']."\ 现在我桌上还摊着那张被揉皱又展平的流程图,上面手写着“支付回调验证→验签→解密→解析JSON→入库”,箭头歪歪扭扭。旁边贴着便利贴:“注意:生产环境openssl_decrypt返回bool false而非throw exception”。这张纸是我自己写的,但墨水有点洇,像被什么水汽晕开了。我不记得当时是不是在下雨。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


建站新手必避的7大运维坑:第5个90%人忽略
ASP脚本避坑指南:5个新手常忽略的语法细节
运维新手必避的5大服务器配置坑,第3坑90%人踩
Linux新手避坑指南:12年工程师实战安装配置