PHP调试难?H5开发者必备5个网页调试技巧
|
今天下午三点零七分,监控告警弹窗跳出来,H5活动页白屏率突增至四成——不是全站,就卡在「领券倒计时」那块小模块。我切到 staging 环境,F12 打开,Network 里 status 栏密密麻麻全是 502,但 PHP-FPM 进程明明活着,日志里连 warning 都没一条。老张端着保温杯路过,探头看了眼,说:“你重启下 Nginx 吧,上回也是它抽。” 我原以为又是 upstream 超时,结果 curl -I http://staging.api.xxx.com/v2/coupon/timer 直连 PHP 服务,响应头里赫然带着 X-PHP-Response-Time: 38624ms。三万八千毫秒?这哪是响应,是等它烧完一炷香。我扒拉出那个 timer.php,里面就三行:调 Redis、查 MySQL、return json_encode(...)。Redis 连接池正常,MySQL 的 slow_log 也空着——它压根没走到 SQL 就卡住了。
文章配图,仅供参考 第八次把 xdebug 启动参数加到 php.ini 里,重启 fpm,再刷新页面,XDEBUG_SESSION_START=1 追过去,结果断点根本进不去——header 早被 nginx 缓存了,response body 僵在 proxy_buffer 里,连 debug 日志都没吐出来。我翻到 /etc/nginx/conf.d/xxx.conf,删掉 proxy_buffering off 那行,重新 reload,还是 502。同事小陈凑过来瞄了眼,突然指着 access_log 里一条记录说:“你看这 IP,怎么是运维组测试机的?”——对,就是那个上周被误配进上游服务器列表的 test-db-03,它的 PHP 配置里 disable_functions 暴力禁掉了 pcntl_fork,而 timer.php 正好调了个 vendor 包里的异步心跳检测,那个检测没做任何 fallback,直接 die()。它没报错,没 exit,就静静坐在那儿,等一个永远不来的新进程。我盯着 screen 里 tail -f /var/log/php7.4-fpm-slow.log,光标停在最后一行:“script ‘/var/www/html/api/v2/coupon/timer.php’ finished”,后面再无下文。二十来分钟前的事,现在想起来手指还在抖。 (昨天保洁阿姨擦了三次显示器右下角那块油渍,总擦不干净) (Chrome 地址栏右侧的锁图标,今天上午起就一直显示“连接不安全”,其实证书是有效的,DevTools 里 Security tab 查不到异常) 我删掉 test-db-03 的 upstream 配置,reload nginx,页面唰一下就出来了——倒计时数字在跳,红底白字,还带个微妙的呼吸动效。但问题不是解决,是绕开了:PHP 代码本身没改,只是躲过了那个挂死的机器。优胜劣汰?嗯,活下来的不是最健壮的,是最先被踢出负载池的那个。可谁记得去 audit 所有 upstream 的 php.ini?尤其是那台三年前临时加进来、没人敢动的 test-db-03。老张保温杯底磕在桌沿上,咔哒一声。他刚才随口说“上回也是它抽”,我查了变更记录,上回根本没这台机器。我也不知道他是记混了,还是另有所指。 有谁碰到过这个吗 (编辑:航空爱好网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


PHP调试总卡壳?3步精准定位90%技术隐藏Bug
PHP调试总卡壳?老工程师的3个断点盲区
WHOOPS PHP调试库的使用

