PHP调试太难?H5开发者必学5大网站调试技巧
|
2025年10月17号下午三点十七分,我在测试机(华为P40,系统12.1.0.185)上点开那个H5活动页,首屏转圈、按钮点了没反应、控制台一片红——不是报错,是根本没console.log,连window.__debug就挂在那儿没人动。我下意识按F12,Network里PHP返回200,但response空得像被抽过真空。产品经理站在我工位边说“就差这一个埋点”,端着杯子,水汽糊了半边镜片,杯底磕在显示器支架上“咔”一声。 白板没擦干净,上次迭代的接口字段还斜着写在右下角:“/api/v2/promo?utm=xxx&sid=xxx(后端确认OK)”,墨迹被蹭花了,“OK”只剩半个“O”。我切回Chrome DevTools,Performance面板拉到6.2s那一帧,JS堆内存峰值卡在328MB,但主线程卡死在parseHTML里——而那行HTML是后端硬塞进模板里的``,没加htmlspecialchars,也没判空,只加了注释:// 临时方案,下周重构。我Ctrl+Click跳过去,发现这个模板文件上次提交是三天前,作者是后端同事,commit message写的是“修复安卓WebView白屏”,实际改的只是把``标签挪到了``前面。 键盘上Q键掉了,胶印还在,我用指甲盖顶着按Shift+Q调出Quick Open,搜`promo.js`,出来两个同名文件:一个在`/src/`, 一个是`/build/dist/`里被webpack拷过去的副本——build目录下的`promo.js.map`里sourceURL指向的是`webpack:///./src/promo.js?`,但真实路径已经被CDN缓存,304响应头里Last-Modified是10月15号,比Git记录早两天。我盯着network里那个304请求看了七秒,背后有人走过,椅子腿刮过地砖,声音像拖鞋踩在水泥地上。我忽然想起上午联调时后端说“PHP里用了new DateTime(),本地没问题”,我回他:“你date_default_timezone_set()设哪儿了?”他说:“放global_config.php里啊。”我翻了下全局配置,发现那行代码被注释掉了,注释是去年写的:“临时关掉,避免报时区警告”。 工位显示器竖着,方便看长页面DOM树。我缩放拉到80%,展开``,里面嵌了三个``,其中一个src是`/promo-banner.php?sid=xxx`,加载耗时记不清了,大概几秒,但Response Headers里写着`X-PHP-Backend: nginx+php-fpm-7.4.33 (cli)`,而我们的部署文档写的是8.1。我curl了一把,果然,`phpinfo()`吐出来的是7.4,连opcache都关着。没人告诉前端这事,运维发的发布清单PDF里写的是“环境已升级”,PDF最后一页有手写小字:“php-fpm config未同步,待处理”,字迹和白板上那个“O”是同一只马克笔。 我关掉所有devtools面板,重开——这次不急着点Network,先点Sources,在左侧file tree里找到`/promo-banner.php`,右键“Blackbox script”,然后F5。空白页闪了一下,终于打出`[Error] Cannot use object of type stdClass as array`,位置在第83行,`foreach ($data->items as $item)`。我点进去,发现$data是从`json_decode(file_get_contents($url))`拿的,而$url指向的是个内网接口,返回头里带`Content-Type: text/html; charset=utf-8`。对,HTML。不是JSON。不是application/json。是HTML——里面裹着一行{"items":[{...}]}。我截了个图,发给后端,他回:“啊?我们改过header,可能没生效。”十分钟后,我再curl,header还是text/html。他补了一句:“刚在nginx conf里reload了,你再试试?”我没试。我把iframe src改成`/promo-banner.php?sid=xxx&format=json`,后端那边根本没接这个参数,于是PHP直接`die('format not supported')`,但die之前忘了header('Content-Type: application/json'),于是前端收到一个500响应体,status是200,content-type是text/html,控制台不报错,只在Response里静静躺着一行红字:`format not supported`。 外卖到了没人去拿,袋子在茶水间门把手上晃了二十二分钟。我撕开泡面盖子的时候才想起来:那个`$banner_data['title'] ?? ''`,其实是个对象,不是数组——因为后端在PHP里把`json_decode($json, true)`改成了`json_decode($json)`,却没改所有调用点。第83行崩掉的foreach,就是唯一一个没加`is_array()`兜底的地方。我改完推上去,commit message只写了“fix promo banner crash on PHP strict mode”,没提`??`操作符在对象上会触发__toString隐式调用这种破事。反正测试机跑通了,P40上滑动不卡了,按钮也亮了。但我现在看见` (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

PHP调试总卡壳?3步精准定位90%隐藏Bug

