PHP接口超时后为什么任务还在跑

最近处理一个后台接口时遇到一个比较容易误判的问题:用户点击执行任务,前端等了几十秒后提示请求超时,但过一会儿刷新页面,却发现任务其实已经执行成功了。有些用户看到报错后又点一次,结果同一批数据被处理了两遍。

最开始以为是 PHP 超时以后程序就会停止,实际排查日志才发现,浏览器断开连接和服务端 PHP 停止执行并不是一回事。前端请求虽然已经超时,Nginx 也可能结束等待,但 PHP-FPM 里的脚本仍然在继续执行后面的数据库查询、文件处理或者第三方接口请求。

后来把耗时操作从普通接口里拆了出来。用户点击后,接口只负责生成一条任务记录并立即返回任务编号,真正的数据处理交给后台任务执行。页面通过任务状态判断处理中、成功还是失败,重复点击时也会先检查同一任务是否已经存在,避免再次提交。

同时给每个任务增加开始时间、结束时间、执行结果和异常日志。这样即使后台处理几分钟,前端也不需要一直保持 HTTP 请求。

现在做批量处理、文件生成、数据同步这类耗时功能时,我一般不会让一个 PHP 请求从头跑到尾。接口响应时间和业务执行时间最好分开处理,不然一旦网络慢或者前端超时,很容易出现"页面说失败,后台却已经执行"的情况。

#PHP开发 #接口超时 #后台任务 #系统开发

相关推荐
deli0072 小时前
手机20%突然关机?电量百分比是估的,SOC曲线4组实测
前端
apcipot_rain3 小时前
C++转Java日记(06)
java·开发语言
SomeOtherTime10 小时前
Rust所有权(AI回答)
开发语言·后端·rust
Easyhood10 小时前
Android 开发入门实践(十四):Compose 副作用入门与四个常用 API
android·开发语言·kotlin·android jetpack·compose
白杨尚青11 小时前
C++进阶篇(六):map 和 set 的模拟实现——用红黑树封装 mymap/myset(迭代器 + operator[])
开发语言·c++·迭代器·stl·set·map·红黑树
深蓝AI12 小时前
Meta 开源用了八年的设计系统 astryx:连坐两天 GitHub 总榜第一,组件库开始写给 agent 的说明书
前端·人工智能
IT_陈寒13 小时前
Vue的watch把我坑惨了,原来要这样用才靠谱
前端·人工智能·后端
1-1=013 小时前
Vue 3 模板语
前端·javascript·vue.js
用户76103044737113 小时前
【转战智能眼镜开发】ROKID AIUI 小游戏 亚马逊标枪项目实战讲解
前端
风卿13 小时前
看着AI写代码太孤独了,来欣赏星云吧:一个DSH 装饰插件
前端·javascript