PHP接口请求超时,这个报错我在生产环境里排查过太多次了。同样是“超时”,背后可能是PHP进程卡死、数据库锁表、第三方接口响应慢、DNS解析超时甚至Nginx配置问题,解决方案完全不同。这篇内容我尽量按照实战排查的顺序来讲,从定位思路到具体参数,再到代码层面的坑,最后给一套可以直接用的排查流程和速查表,希望对正在被这个问题折磨的你有帮助。
先说清楚适用对象:不管你是用原生PHP、ThinkPHP还是Laravel,不管你的接口是给App、小程序还是给别的后端服务调用,只要遇到“请求超时”“504 Gateway Timeout”“cURL error 28”这类问题,下面的排查思路都可以直接套用。
1. 先别急着改超时:请求超时到底发生在哪一层
很多人的第一反应是“把超时时间调大”,这其实是最危险的做法。掩盖问题不等于解决问题,而且超时时间一旦调大,用户端的等待时间变长,接口被大量并发拖住的风险反而更高。正确做法是先搞清楚:超时到底发生在哪一层。
1.1 一次接口请求的完整时间线
从一次完整的请求链路看,任何“超时”都意味着某一环没有在规定时间内返回。以最常见的Nginx + PHP-FPM架构为例,时间线大致是这样:
- 客户端发起HTTP请求,经过DNS解析、TCP三次握手,到达Nginx;
- Nginx将请求转发给PHP-FPM(通过FastCGI协议);
- PHP-FPM启动(或复用)一个worker进程执行PHP脚本;
- PHP脚本内部可能继续调用MySQL、Redis、第三方HTTP接口、文件存储等;
- 脚本执行完毕,将响应返回给Nginx;
- Nginx将响应返回给客户端。
这个链路的每一环都有自己的超时时间。Nginx有fastcgi_read_timeout,PHP-FPM有request_terminate_timeout,PHP脚本自身有max_execution_time,MySQL有connect_timeout和wait_timeout,Redis有timeout,cURL有CURLOPT_TIMEOUT。任何一个环节先到时间,整个请求就表现为“超时”。
所以碰到超时问题,第一步不是打开代码瞎猜,而是先判断超时是发生在哪个环节。判断依据很简单:看超时时长跟哪个配置的阈值最接近。比如Nginx返回504 Gateway Timeout,通常是fastcgi_read_timeout(默认60秒)到了;如果PHP-FPM日志里有“max_execution_time exceeded”,就是PHP脚本执行超过max_execution_time(默认30秒)。
1.2 超时问题的三个基本分类
根据我自己的排查经验,所有超时问题基本都能归到三类:
第一类是客户端视角的超时。比如App里用OkHttp设置10秒超时,小程序里wx.request默认60秒超时,前端Axios默认超时时间可能很短。这种情况下后端可能还在正常处理,只是处理速度超过了客户端的耐心阈值。重点排查接口本身是否慢,慢在哪一步,以及客户端超时设置是否合理。
第二类是服务端处理超时。PHP-FPM、Nginx或Apache自带的超时配置触发了中断,接口直接被掐断。这种情况往往伴随网关错误码(502/504)或服务端日志中的超时记录。重点看PHP慢日志、FPM错误日志和Nginx错误日志。
第三类是调用下游依赖时超时。PHP代码里curl请求第三方接口、连接MySQL、读Redis,这些调用耗时超过了自己设定的阈值,导致整个请求失败。这类问题最隐蔽,因为问题往往不在自己的服务上,而在下游。
我记得有一次排查一个“接口偶发超时”问题,表象是App请求接口经常卡住十几秒后报错。刚开始怀疑代码性能,后来发现是代码里调用一个外部开放API时没有设置超时时间,对方服务偶尔响应很慢,默认的cURL没有超时限制,就一直等到客户端(小程序)60秒超时才断开。问题根源不在我们自己,但暴露出的却是我们自己的代码没有兜底。
1.3 排查前期准备:日志与工具
在动手前,先把下面这些东西准备齐,不然排查效率会很低:
- 完整接口信息:请求URL、请求方法、参数、耗时、返回码;
- 服务端日志:Nginx access log和error log、PHP-FPM日志、应用日志;
- PHP-FPM慢日志:这是定位性能瓶颈的利器,后面会细说;
- 数据库慢查询日志:打开MySQL的slow_query_log;
- 命令行工具:curl、time、strace、tcpdump,Linux服务器上提前装好。
另外建议在应用日志里给每个请求打上trace_id,从Nginx到PHP再到数据库调用都带上这个ID。这样一旦出现超时,可以顺着trace_id把整条调用链拼起来。这个习惯我强烈建议养成,排查任何接口问题都能省一半时间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 服务端PHP处理超时:最常见的坑
先说服务端处理超时,这是PHP接口超时里最直接的场景。你会在Nginx看到504 Gateway Timeout,或者PHP-FPM日志里出现“Execution timed out”。这种情况通常是脚本执行确实超过了某个配置的阈值。
2.1 Nginx与PHP-FPM超时参数对照
很多老项目的配置是默认值一路用到底,从来没人认真调过。先看一张表,把常见的超时参数和默认值列出来:
| 所在服务 | 参数名 | 默认值 | 含义 |
|---|---|---|---|
| Nginx | fastcgi_read_timeout | 60s | 读取FastCGI响应超时 |
| Nginx | fastcgi_connect_timeout | 60s | 连接FastCGI服务超时 |
| Nginx | proxy_read_timeout | 60s | 反向代理读取超时 |
| PHP-FPM | request_terminate_timeout | 0(不限制) | worker处理请求最大时间 |
| PHP | max_execution_time | 30s | 脚本最大执行时间 |
| PHP | max_input_time | 60s | 接收输入数据最大时间 |
| Apache | FcgidIOTimeout | 40s | 读取FastCGI响应超时 |
这个表里最容易踩坑的是fastcgi_read_timeout和request_terminate_timeout的配合。假设Nginx的fastcgi_read_timeout是60秒,PHP-FPM的request_terminate_timeout设成了90秒,PHP脚本执行到80秒被FPM强杀。Nginx等不到FastCGI的响应,会在60秒时先返回504还是继续等?实际上Nginx在60秒就已经判定超时了,所以客户端先看到504,而FPM日志里可能只有一条“request_terminate_timeout”的错误,两边的报错时间可以对上。
还有一种更隐蔽的情况:Nginx fastcgi_read_timeout设成60秒,PHP脚本执行到65秒才完成,超时被Nginx截断,但其实脚本本身逻辑是正常的,只是确实慢。这时候把fastcgi_read_timeout调大到120秒可能就解决了。不过我不建议盲目调大,而是先确认慢在哪里。
2.2 PHP-FPM慢日志的打开方式
定位PHP执行慢在哪一步,最有效的工具之一就是PHP-FPM慢日志。这个功能默认关闭,开启步骤很简单:
ini复制; php-fpm.conf 或 pool配置中
slowlog = /var/log/php-fpm-slow.log
request_slowlog_timeout = 5s
request_terminate_timeout = 30s
配置说明:
- request_slowlog_timeout 设为5秒,表示执行超过5秒的请求会被记录到慢日志;
- slowlog 指定慢日志路径,注意PHP-FPM进程需要有写权限;
- request_terminate_timeout 一般建议不要设0,至少要给一个兜底值,防止脚本跑死占住worker不释放。
开启后重启PHP-FPM。再遇到超时请求,慢日志里会出现类似这样的内容:
code复制[18-Apr-2025 14:23:10] [pool www] pid 12345
script_filename = /data/www/app/public/index.php
[0x00007f8f6c0028a0] file_get_contents() /data/www/app/library/HTTP.php:123
[0x00007f8f6c0027d0] get_remote_data() /data/www/app/controller/Order.php:456
注意看函数调用栈。上面这个例子,卡在file_get_contents这个函数上,说明代码里在等待一个远程请求返回。慢日志直接告诉你PHP卡在哪个函数,省去了大量猜代码的时间。
2.3 代码层面的“隐形超时”:死循环、阻塞与慢SQL
有些超时不是外部配置触发的,而是PHP代码本身陷入循环或阻塞,导致脚本跑不完。这种问题有两个特点:接口偶发超时,请求量上来之后尤其明显;服务端日志没有明显的超时记录,只有FPM worker被占满的迹象。
排查这类问题时,除了看慢日志,还要注意一些常见代码模式:
- 外部HTTP请求没有设置超时时间,对方服务不返回就一直等;
- while循环里条件写错,变成死循环;
- 大数据量下使用递归且没有退出条件;
- 使用单例连接池时,连接被占满,新请求等待连接释放;
- 直接使用file_get_contents读远程URL,且没有设置超时上下文。
这里也要提醒一句:ThinkPHP 3.2.3这类老框架,底层封装了curl和数据库操作,很多地方默认没有强制超时。如果你用到老框架,记得检查框架的HTTP请求类是否暴露了超时参数。我见过不少项目直接拿框架自带的curl方法请求第三方,没设置任何超时,在第三方偶尔抖动时整个接口就跟着挂了。
3. 调用第三方接口和数据库时的超时
服务端处理超时相对好定位,难的是下游依赖超时。PHP脚本自己执行很快,但调了一个外部接口等了20秒,整个请求就慢了。这部分我重点讲一下几类常见依赖的超时控制,因为太多人在这里吃亏。
3.1 cURL、Guzzle与file_get_contents的超时设置
先看cURL。很多人知道CURLOPT_TIMEOUT,但不知道还有个CURLOPT_CONNECTTIMEOUT。这两个是不同阶段的超时:
- CURLOPT_CONNECTTIMEOUT:TCP连接建立的超时时间;
- CURLOPT_TIMEOUT:整个cURL请求(从连接到传输完成)的总超时时间。
建议connect超时设短一点,3秒足够;总超时根据业务需求设,一般10到30秒已经算长。示例:
php复制$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.example.com/data',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 3,
CURLOPT_TIMEOUT => 10,
CURLOPT_DNS_CACHE_TIMEOUT => 30,
]);
$response = curl_exec($ch);
if (curl_errno($ch)) {
// 处理错误,cURL error 28 就是总超时
$errorMsg = curl_error($ch);
}
curl_close($ch);
这里有个细节:域名解析也占用时间。如果业务服务器的DNS解析慢,整个请求会被拖住。CURLOPT_DNS_CACHE_TIMEOUT可以设置DNS结果缓存时间,但前提是本地已经解析过一次。
如果你用的是Guzzle,建议在client配置里统一设置timeout和connect_timeout:
php复制$client = new \GuzzleHttp\Client([
'timeout' => 10,
'connect_timeout' => 3,
]);
注意Guzzle 6以上版本还支持"RequestOptions::ALLOW_REDIRECTS"等,但最核心的永远是timeout和connect_timeout。异步请求场景还可以用Guzzle的异步客户端加Promise,配合超时回调做降级。
对于还在用file_get_contents的老代码,赶紧改成cURL或Guzzle。如果暂时不想改,至少要加超时上下文:
php复制$ctx = stream_context_create([
'http' => [
'timeout' => 5,
],
]);
$data = file_get_contents('https://api.example.com/data', false, $ctx);
但说实话,file_get_contents接收响应是在内存里一次性完成的,不支持流式处理,对超时控制也不够精细,能换就换。
3.2 数据库连接超时与慢查询
数据库是另一个大头。PHP连接MySQL,如果MySQL连接数满了或者网络不通,PHP会一直等connect_timeout(MySQL默认10秒)才超时,而很多时候PHP默认的mysqli连接超时配置也没设。
PDO连接MySQL时可以设置超时:
php复制$dsn = 'mysql:host=127.0.0.1;dbname=test;charset=utf8mb4';
$options = [
PDO::ATTR_TIMEOUT => 3,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
];
$pdo = new PDO($dsn, 'user', 'pass', $options);
另外还有两类数据库相关超时值得注意:
- 慢查询导致PHP等待结果集返回,最终PHP侧超时。打开MySQL慢查询日志,把long_query_time设置为1秒甚至0.5秒,方便抓出隐藏的慢SQL;
- 锁等待。两个事务互相锁表,后面的查询一直等待。用SHOW PROCESSLIST看有没有大量State为“Waiting for table metadata lock”的连接,或者用SHOW ENGINE INNODB STATUS查看事务锁。
我在实际排查中遇到过一个经典案例:接口在一个事务里先更新订单表,接着调外部接口通知物流,外部接口超时,事务一直不提交,后续所有对这个订单行的更新全部排队等锁。数据库连接池被占满,最终表现就是整个接口大面积超时。这类问题靠调整超时参数没有用,必须改代码结构——把外部调用挪到事务提交之后,或者改成异步消息。
3.3 Redis、Memcached等缓存服务的超时
Redis的客户端超时也要注意。很多人以为Redis一定很快,不会超时,其实当Redis服务器负载高、慢日志多,或者客户端连接数耗尽时,Redis同样会阻塞。PHP的Redis扩展一般可以设置超时参数:
php复制$redis = new Redis();
$redis->connect('127.0.0.1', 6379, 2.5); // 第三个参数是连接超时
$redis->setOption(Redis::OPT_READ_TIMEOUT, 5);
有些框架里Redis连接超时是独立配置的,ThinkPHP 3.2.3的Redis配置里没有独立超时字段,走了默认值,建议做一次压测确认。
3.4 容易被忽略的DNS解析超时
最后提一下DNS解析。很多超时排查到网络层就停了,忽略了DNS。PHP进程发起hostname解析时,如果依赖的外部DNS服务器无响应,解析过程可能耗时很长。在服务器上可以用dig或nslookup测一下DNS解析耗时,也可以用getent hosts测系统解析:
bash复制time getent hosts api.example.com
如果解析稳定在几百毫秒以上,建议检查是不是上游DNS问题。还有一种常见做法是把高频调用的外部服务host写进/etc/hosts,但要注意外部服务IP变更时会失效,运维成本会上升,需要配合监控。
4. 完整排查流程:从日志到strace的实操记录
前面把原理讲清楚了,现在给一套可以照着做的排查流程。这套流程我已经在很多项目里用过,按顺序执行,大部分超时问题都能定位到根因。
4.1 第一步:确认超时是“谁的视角”
先搞清楚是谁在报超时。如果是用户在App上报,先看前端能不能复现,抓取请求的实际耗时:
bash复制curl -v -w "time_total: %{time_total}s\n" https://your-api.example.com/order/list
curl的-w参数可以输出耗时详情,也可以进一步输出DNS解析、TCP连接、TTFB等各阶段耗时:
bash复制curl -o /dev/null -s -w "dns: %{time_namelookup}s, connect: %{time_connect}s, appconnect: %{time_appconnect}s, starttransfer: %{time_starttransfer}s, total: %{time_total}s\n" https://your-api.example.com/order/list
各阶段含义:
- dns:DNS解析耗时;
- connect:TCP建立连接耗时;
- appconnect:TLS握手耗时;
- starttransfer:从发起请求到收到第一个字节的耗时,也就是服务端处理耗时;
- total:整个请求总耗时。
如果starttransfer非常大,说明服务端处理慢,进入第二步。如果connect本身就很大,说明网络链路或Nginx接入层有问题。
4.2 第二步:翻日志,按时间线把线索拼起来
确认服务端处理慢之后,打开这几个日志文件,按同一个时间点找记录:
- Nginx access log:看本次请求的upstream_response_time字段(需要在log_format里配置),这是Nginx收到PHP-FPM返回用了多久;
- Nginx error log:看有没有“upstream timed out”或“connect() failed”;
- PHP-FPM error log:看有没有“max_execution_time”或慢日志记录;
- 应用日志:看有没有异常堆栈或业务流程日志。
如果你发现upstream_response_time是60.001秒,而Nginx的fastcgi_read_timeout正好是60秒,那基本可以断定是Nginx先掐断了。这时候再打开PHP-FPM慢日志,就能看到PHP最后在干什么。
Nginx的log_format建议这样配置:
nginx复制log_format main '$remote_addr [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time $upstream_response_time';
其中的upstream_response_time非常关键。
4.3 第三步:用strace看进程到底卡在哪
如果日志没有给出足够信息,或者你想看更底层的等待情况,可以用strace抓PHP进程的系统调用。
先找到当前处理请求的PHP-FPM worker进程:
bash复制ps aux | grep php-fpm
然后用strace跟踪:
bash复制strace -p 12345 -T -f -o /tmp/strace.log
等几秒后Ctrl+C停止,打开日志看卡在什么系统调用上:
- 如果大量出现poll/select/epoll_wait,且对应的是网络socket,说明在等待外部数据;
- 如果大量read调用等待,且fd指向一个TCP连接,说明在等待对端返回数据;
- 如果是MySQL的socket fd上有长时间的wait,说明SQL在执行/等待锁。
strace在生产环境使用要注意:附加到进程会带来性能损耗,尽量在低峰期、指向某个具体worker进程操作,不要长时间全量抓。如果不想影响线上,可以在测试环境复现同样的问题再抓。
4.4 第四步:查数据库慢查询与锁等待
如果慢日志显示PHP函数栈中包含数据库方法,或者strace显示等待MySQL socket,去MySQL里看:
sql复制SHOW FULL PROCESSLIST;
重点看Time很大、State不为空的连接。常见的State:
- Sending data:SQL在执行,可能索引失效或数据量大;
- Waiting for table metadata lock:有DDL未提交,或存在未提交事务持锁;
- Waiting for lock:行锁等待,配合SHOW ENGINE INNODB STATUS查看具体锁事务;
- Connecting to master:主从延迟或主库连接异常。
打开慢查询日志:
ini复制[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
等下次超时发生后,到慢日志里找对应时间段的SQL,用EXPLAIN分析执行计划。我见过一个接口从2秒超时优化到200毫秒的例子,就是查出一个全表扫描的SQL,加了一个联合索引直接解决。
4.5 第五步:验证修复与回归
修复之后不能只测一次“不超时了”就完事。我建议做三件验证:
第一,用压测工具(ab、wrk、JMeter都行)模拟正常与峰值流量,确认没有并发性能问题。压测时注意观察PHP-FPM worker占用和数据库连接数。
第二,检查上下游超时配置的一致性。客户端、Nginx、PHP、数据库、第三方接口,这条链路上的超时时间应该有合理的梯度,避免出现“内层超时时间大于外层”的倒挂结构。举个例子:客户端10秒超时,Nginx fastcgi_read_timeout 30秒,PHP内部调用第三方接口20秒,一旦第三方卡住,整个请求15秒才返回,客户端已经报错,但服务端还在跑。这个场景下内层20秒就大于外层客户端10秒了。
第三,观察一段时间内的监控指标,确认超时次数明显下降。如果还有偶发超时,查看是否集中在某个下游服务或某个时间窗口。
5. 长效解决方案:超时参数、兜底与监控
排查解决只是第一步,真正要避免以后反复踩坑,需要从配置、代码设计和监控三方面做长效治理。
5.1 超时参数怎么给才合理
超时时间不是越大越好,也不是越小越好,关键是梯度合理。参考一个典型的配置组合:
| 层级 | 建议值 | 说明 |
|---|---|---|
| 客户端(App/小程序) | 10-15s | 用户体验的承受上限 |
| Nginx fastcgi_read_timeout | 20-30s | 必须小于客户端总超时 |
| PHP默认max_execution_time | 30s | 如果业务本身耗时很长,拆异步任务 |
| PHP-FPM request_terminate_timeout | 30s | 兜底,防止worker被占死 |
| 调用第三方HTTP接口 | 5-10s | 不建议超过10s |
| 调用数据库 | 2-3s | 超过基本是SQL或连接问题 |
原则就是:越靠用户侧,超时时间越短;越靠近依赖服务,超时时间也越短。如果接口本身需要长时间处理,不要试图靠加大超时硬扛,应该改成异步任务加轮询/回调。
5.2 代码里的兜底设计:熔断、降级与重试
即使链路其他部分都正常,我们自己的PHP代码也必须做好超时兜底。这既是对用户负责,也是对自己服务负责。
调用第三方接口时,一定加超时,同时捕获超时异常做降级处理。比如获取天气接口超时,可以返回默认的“晴”,而不是整个业务报错。这个用生活类比的话,就像你去餐厅吃饭,招牌菜如果暂时做不出来,服务员应该先告诉你“这道菜今晚可能要等很久,您可以换一个”,而不是让你干等一小时。
对于依赖度高的下游接口,可以考虑熔断器模式。PHP生态里没有Java那样现成的Hystrix,但可以用简单的计数器实现:单位时间内失败次数超过阈值,就直接快速失败一段时间,不发起真实请求。
重试逻辑要谨慎。只有幂等接口才能重试,否则可能造成重复下单、重复扣款等问题。如果必须重试,建议用指数退避加随机抖动,避免重试风暴。重试次数一般不超过3次,间隔从1秒开始翻倍。
5.3 监控与告警:把超时消灭在“发生前”
超时问题彻底消灭不现实,但至少要让超时暴露在监控里,而不是等到用户投诉才发现。
建议监控三类指标:
- 接口耗时分布:P95、P99延迟,比平均值更重要;
- 超时错误数量:按接口、按错误码拆分,比如cURL error 28、504、MySQL超时等分别统计;
- 下游依赖健康状况:MySQL、Redis、第三方API的响应时间与错误率。
PHP业务监控可以借助日志采集(ELK、Sentry等)或Prometheus。如果是轻量方案,最简单的是在应用里打结构化日志,把每次请求的耗时、超时错误统一记录,再用日志平台做告警。这样“偶发超时”就不再是黑盒了。
6. 常见问题与排查技巧快查表
最后整理一份快查表,适合直接贴在项目Wiki里,或者给接手的人当排查手册用。
6.1 按报错特征快速定位
| 现象 | 可能原因 | 优先排查点 |
|---|---|---|
| 504 Gateway Timeout | 上游PHP处理超过Nginx超时 | Nginx error log、PHP-FPM慢日志 |
| 502 Bad Gateway | PHP-FPM无可用worker或进程退出 | 检查FPM进程数、PHP错误日志 |
| cURL error 28 | 外部请求总超时 | 检查CURLOPT_TIMEOUT、对方服务可用性 |
| cURL error 7 | 连接失败 | TCP/网络/DNS |
| 数据库“Too many connections” | 连接池耗尽 | SHOW PROCESSLIST、连接池配置 |
| 接口偶发超时,低峰不出现 | 慢SQL/锁等待/外部依赖抖动 | 慢日志、锁等待、第三方接口追踪 |
6.2 几条经验性判断
先说一条容易忽略的:PHP-FPM的pm.max_children设置过小,请求一多就会排队。此时接口反映“很慢”“卡死”,但不一定会报超时,客户端只要等得够久最终还是会拿到响应。排查时用ps aux | grep php-fpm看worker数量是否打满,配合netstat看FastCGI连接队列。如果打满,优先优化,而不是无脑增加max_children,内存不够会频繁触发OOM。
再说一个我现在坚持的做法:所有外部HTTP请求统一封装到一个HTTP类里,默认强制设置connect_timeout和timeout,不允许业务代码直接new curl实例。这样即使有人新写代码,也不会漏配超时。用老框架的项目,建议先在底层把这一层补上。
6.3 三个容易忽略的坑
第一,系统时间不同步。如果在多台服务器之间排查,Nginx日志和PHP-FPM日志的时间对不上,很容易误判。用NTP同步一下服务器时间。
第二,代理或负载均衡器隐藏了真实耗时。有些项目前端请求先到SLB/负载均衡,再到Nginx。这时候客户端看到的超时,可能是负载均衡层面的问题,需要结合负载均衡的日志和监控看。
第三,代码里的sleep和阻塞调用。我之前遇到过有人为了“防止接口频率太高”,在代码里直接sleep(5),接口自然慢得离谱。排查慢日志时看到这类调用要果断去掉,限流应该用专门的中间件或网关,而不是在业务代码里sleep。
还有一个跟前端相关的小点:如果你遇到的是uniApp或小程序端调用接口超时,注意wx.request默认超时是60秒,uni.request也有自己的timeout配置。前端设了超时时间之后,后端如果处理时间超过这个值,前端会提前报错,但后端可能还在处理。遇到这类反馈要先看前后端超时时间是否匹配,不要一上来就怀疑后端。
一句话收尾
关于PHP接口请求超时,我个人的体会是:绝大多数超时问题都不是单一原因,而是链路中多个环节的配置、代码和依赖叠加造成的。只要坚持用日志、慢日志、strace、数据库排查这几板斧,按“先定位现象,再分析链路,最后修复验证”的顺序走,你也能很快找到根因。最后再分享一个小技巧:每次处理完一个超时问题,把这次的链路截图、日志和结论整理成一页文档,长期积累下来,你会发现自己团队排查同类问题的速度越来越快。
