HTTP客户端请求断开 后台如何自动终止继续执行代码

miaoxiaoye

如果客户端在请求过程中主动断开连接(例如关闭浏览器或网络中断或其它原因),服务端目前默认仍会继续执行。请问如何在 webman 中检测到客户端请求已经断开,并让后台自动终止后续代码的执行?

635 6 0
6个回答

tanhongbin

这个是停止不了的,任何语言都不能 一个请求进入内存中除了异常不会中断执行的

  • miaoxiaoye 2025-09-16

    那要怎么监测 并抛出异常呢?

  • tanhongbin 2025-09-16

    这个是搞不了的,http请求一次性请求 不是长连接 没办法断开的

阿沁

为什么会有这种奇葩需求

  • miaoxiaoye 2025-09-16

    这种需求算奇葩?客户端HTTP请求断开 服务端正常逻辑不就是应该断开吗?如果有人直接同时发送100请求后断开 你服务端不断开 还在运行意义在哪里呢?

  • tanhongbin 2025-09-16

    这个不可能实现的 这么说吧还是对http协议不了解 看一下就懂了

  • 阿沁 2025-09-19

    可以说一下应用场景

胡桃

令牌机制。把Cancellation传入业务,TCP连接断开事件加上cancel,改造一下框架和业务代码的事。

https://reactphp.org/promise/#promiseinterfacecancel
https://amphp.org/amp#cancellation

可以参考C#,所有Async系统库支持传递Token,语言层面的原生支持。
https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.cancellationtokensource?view=net-8.0

morris

找找有没有能监听tcp 链接断开的回调事件

  • tanhongbin 2025-09-16

    就是知道了又能如何呢 业务执行中,除非重写 http进程 那个类而且很复杂的

  • morris 2025-09-17

    假如是go的话 。 监听到tcp链接断开 。 用 context 就可以调用cancel 取消后续操作 。 php 好像办不到

超高级的稻姬

使用thinkphplaravel这类的fpm框架可以快速解决你的问题,如果想要继续使用webman并且想要实现你的需求的话,你可以需要使用协程模式,并且需要去监听每个连接对应发送报文被解析出来的请求的协程列表,当连接断开的时候往这些协程发送异常让这些协程在下次获取到CPU的时候中断。原理大概如此,具体实现我个人水平不够无法做到。

  • tanhongbin 2025-09-18

    tp lv 咋实现的? 他们更不能实现 nginx -> php 然后php-fpm 进程还能中断?

  • 超高级的稻姬 2025-09-18

    nginx 到 php-fpm 之间的连接断开,fpm会kill正在执行的进程

  • damao 2025-09-18

    fpm咋可能随便kill进程。正在支付呢,钱扣完了发货时kill掉了 😂

  • tanhongbin 2025-09-19

    就没遇到过nginx超时 但是php还在运行的情况嘛,你把ngixn调哼2s超时 然后php那边睡眠3s 在打印日志 你看看有么有日志

小阳光

可以实现,只是看你值得这么做不,最简单粗暴的方式 在监听到tcp关闭事件强制关闭正在处理http请求的进程。肯定还有其他优雅的方式。

  • 暂无评论
🔝