从日志开始下手
后端出问题,第一反应别急着改代码。打开日志文件看看,比如常见的 access.log 或 error.log。服务器一报错,通常都会留下痕迹。比如用户登录突然失败,你去查日志发现一堆 SQLSTATE[23000]: Integrity constraint violation,那基本就是数据库外键冲突了。
如果你用的是 Laravel,日志在 storage/logs/laravel.log;Spring Boot 项目就看启动时输出的 console 或者 logback 配置的文件路径。一行行翻,重点找 ERROR、Exception 这类关键字。
接口请求先抓包
前端说调不了后端接口?别光听他说。自己拿 curl 或 Postman 试试。比如这个请求:
curl -X POST http://api.example.com/v1/users \
-H "Content-Type: application/json" \
-d '{"name":"张三","email":"zhangsan@example.com"}'如果返回 500,说明服务端炸了;返回 400,可能是参数校验没过。这时候再回过头去看对应接口的处理逻辑,比盲人摸象强多了。
检查环境配置
本地跑得好好的,上线就崩?多半是环境差异。数据库连接、Redis 地址、API 密钥这些,在测试环境和生产环境经常不一样。检查一下 .env 文件是不是漏配了什么。比如 Laravel 里 DB_HOST 写成了 localhost,但生产用的是 Docker,应该填 mysql 才对。
还有种常见情况:PHP 项目上了新服务器,没装 Redis 扩展,一执行 Cache::store('redis') 就直接报 Class not found。这种得登录服务器,运行 php -m | grep redis 看有没有加载。
数据库语句别放过
很多后端错误其实是 SQL 搞的鬼。比如你要查一个用户的订单,写了个 JOIN 查询,结果忘了加 ON 条件,变成了笛卡尔积,数据量一大,直接超时。这时候看慢查询日志就能发现问题。
MySQL 可以打开 slow query log,设置 long_query_time=1,然后重现操作。如果发现某条 SELECT 跑了十几秒,复制出来用 EXPLAIN 分析下执行计划,看看是不是缺索引。
依赖服务也得查
现在系统都拆微服务了,你的接口可能依赖认证中心、支付网关、短信服务。某个环节挂了,你这边也会跟着报错。比如调微信支付回调一直失败,先确认是不是对方域名被防火墙拦了。
可以用 telnet 或 nc 测试连通性:
telnet api.mch.weixin.qq.com 443连不上就得找运维看网络策略。要是能通,再用 curl 加上证书发起 HTTPS 请求,一步步验证。临时加点输出调试
有些问题日志里看不出头绪,干脆在关键位置加点调试信息。比如怀疑某个函数没被执行,就在开头写个日志:
Log::info('进入用户创建流程', ['data' => $input]);或者 Python 里来一句:
print(f'[DEBUG] 用户邮箱: {email}')注意别把敏感信息打出来,调试完记得删掉。线上环境尽量用配置控制是否开启 debug 输出。
版本和部署别忽略
昨天还好好的,今天突然不行?想想最近动过啥。是不是刚上了新版本?回滚试试看。Git 记录里发现刚刚合并了一个分支,里面改了 JWT 的签发逻辑,导致所有旧 token 失效——这就找到了根源。
另外,CI/CD 流水线有没有完整跑完?有时候前端静态资源上传失败,后端接口其实没问题,但页面打不开让人误以为整个系统瘫痪。