PHP调试总卡壳?9年容器运维工程师的3步精准定位法
|
“这版间距又不对!”小张把数位笔啪一下拍在桌沿,笔尖刚换过,塑料壳还带着点毛边——他昨天下午蹲在淘宝搜了二十分钟才买到同款。我正扒拉php-fpm的进程树,听见就抬了下头:“你指哪块?首屏还是空态?”他没理,转头去敲前端老李的显示器边框:“李哥,你看看这个栅格……”老李耳机挂着一只,短视频外放声混着抖音提示音往我这边飘:“稍等啊——哎这BGM我熟!” 去年清明节,改到第九版那一刻,我盯着docker logs -f那串滚得比清明雨还密的报错,突然意识到:PHP调试卡壳,根本不是代码写得差。是环境在演双簧——你改一行,它藏三处,还自带缓存滤镜。我原以为是opcache关不干净,结果翻完configmap发现,是nginx那层proxy_buffering被product.yaml硬编码开了,连着两个小时没reload。但凡谁动过deploy.yml里的annotations,都不至于卡在那个502上两小时。 先扔结论后补细节。三步:第一,进容器里curl localhost:9000/phpinfo.php,看实际生效的配置——别信你本地配的.ini,信它此刻嘴里吐出来的字。第二,用strace抓php-fpm主进程,盯住openat()和stat()调用顺序,哪个文件它读了三次、哪个根本没打开——有次我抓出来,它居然在读/var/www/html/conf/local.php.bak,而我们所有人都忘了这玩意儿还在volume里躺着。第三,删掉所有xdebug配置,换blackfire probe打个轻量profile,看耗时毛刺落在哪一层,是PDO prepare卡了,还是file_get_contents偷偷连了内网DNS超时。优胜劣汰?真不是虚的。你信xdebug断点,它就给你假断点;你信日志等级,它就给你阉割日志;你信文档写的默认值,它就给你一个被k8s configmap覆盖八百遍的默认值。 窗台上的绿萝死了半盆,叶子卷边发黄,上周五行政说要换新的,到现在还没来人。小张刚走,我就顺手把那杯干了的马克杯推到显示器底下——杯底一圈茶渍已经嵌进木纹里,擦不掉了。我其实挺想问问他,为什么总把切图命名搞成“按钮_蓝_改版_v3_最终版_不要改.png”,可一开口就想起前天产品拿需求文档截图问我:“你这环境能跑通ta的demo分支吗?”我说能,结果她自己push了个带console.log('debug')的JS进来,触发了build脚本里的eslint —fix,生生把整个vendor目录格式化成了空行。 色板里那个说不清的灰,RGB 128,128,128?还是127?反正设计稿里写了#808080,开发问是不是深灰,我看了眼本地取色器——显示器有点色偏,右下角偏青,左上角偏黄,中间那一块倒是准的。我截图发群里:“以这里为准”,没人回。后来发现是devtools里element面板的computed样式,把继承来的color刷掉了,真正起效的是global.css里第421行那个!important——但人家没加注释,只写了“适配老安卓”。我信了,然后花了四十七分钟调padding-top,最后发现是transform: scaleY(.99)把文字压扁了0.01px,导致line-height计算错乱。这不是PHP的事,但我那天就是在这儿卡住的。 跟产品或前端的争执?争过。上个月,前端说PHP接口响应慢,我让他curl -w “\ 切图文件夹里的命名乱七八糟,有的按组件分,有的按页面分,有的直接叫“首页大图@2x.jpg”,但实际尺寸是@3x,因为设计师导出时勾错了比例。有一次我配env的时候,把APP_DEBUG写成了app_debug,Kubernetes直接把它当字符串塞进php.ini,而fpm只认大写常量,结果debug信息全吞了,error_log里安静得像没人上班。我排查了俩钟头,最后靠tail -f /proc/$(pgrep php-fpm)/environ才捞出来那行小写键名。 无所谓。真无所谓。你让PHP报错,它报;你让它不报,它就不报;你怀疑它报假错,它还真能报个逻辑闭环的假错。去年清明节,我连着三天没回家,在公司把一套CI pipeline从GitLab迁到Jenkins,中间替换了七套helm chart版本,为的就是让某一个API在dev环境返回正确header。结果上线那天,客户说“怎么还是406 Not Acceptable”。我重看一遍response,Content-Type居然是text/plain;再查ingress annotation,发现teamA去年留下的kubernetes.io/ingress.class: nginx-legacy还钉在yaml里,没删。而新集群根本没装那个ingress controller。就这么个事,耽误了三天排期。
文章配图,仅供参考 所以现在我进任何项目,第一件事不是搭环境,是grep -r "xdebug" "opcache" "display_errors" —include=".ini" ./;第二件事是找那个藏在chart/values.yaml最底下的extraEnv;第三件事,是看一眼团队有没有人在README.md里写“请务必确认PHP_VERSION=8.1.12而非8.1.12-alpine”。没有?那就手动记一笔,贴在显示器边框上,贴的位置正好盖住绿萝枯叶投下来的影子。 对了,那只干了的马克杯,今天下午我打算洗。水龙头有点漏,滴答、滴答,声音比php-fpm slow log还准。 (编辑:草根网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


PHP调试总卡壳?3个老运维私藏断点技巧

浙公网安备 33038102330473号