ignore_user_abort(true);
fastcgi_finish_request(); // 先返回再继续处理
$log = sprintf('%s notify %s %.0fms', date('c'), $tradeNo, $cost);

渠道后台一笔交易的通知记录有六条,间隔都是五秒整。本地日志显示每次都在下载对账文件,单次耗时 7 到 9 秒,接口最后返回 504。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:回调里同步做了发邮件、生成发票、调仓库接口三件事,任何一件慢都会把整体拖过渠道的超时阈值。渠道等不到响应就当作失败重发,形成放大循环。

「回调处理超时」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:回调只做验签、写通知记录、改订单状态三件事,其余动作全部丢进队列;处理时间控制在两秒内,超时前先返回成功,后续失败由队列重试;把耗时打点到日志,超过 1.5 秒记一条 warn,提前发现变慢。

确认没问题再收工,同样一笔通知只出现一条记录,接口响应时间稳定在 300 毫秒以内。

作者 9823189