用户关闭浏览器后服务器端会继续执行吗?

李浩
  • 74
  1. 用户点击页面链接发起一个请求,如果后台处理的时间太久,用户直接关闭浏览器后,服务器端的程序还会继续执行吗?如果执行,怎么让它随着用户关闭浏览器后自动终止?
  2. 用户发起一个ajax请求,服务器端执行时间较久,用户abortion这个ajax请求,后端怎么终止这个请求?
  3. 鉴于http的无状态协议,是不是用户关闭浏览器或者取消ajax请求时,服务器端并不知道,而继续执行?是否需要后台写程序来处理这样的事情?
回复
阅读 15.7k
5 个回答
✓ 已被采纳
  1. 浏览器发起请求,然后服务器开始执行,一直执行到服务器脚步运行完毕或者出现异常或者TIMEOUT。浏览器没法关闭服务器的运行。

    但是……

  2. 技术总是不挺发展,RFC HTTP 1.1 定义了 Connection 响应头,具体的可以参考 PHP的连接处理

  3. http的无状态协议 这个是历史遗留问题,现在的 HTTP 版本也正在解决这个问题,比如上面提到的长链接。定义在 RFC2616(HTTP 1.1)的 Connection。

进一步阅读:http协议学习系列

会的 ,因此 nginx 加入一个 http code :499 表示客户端断开了连接

服务器软件监听到一个请求后,大概会建立一个线程处理这个请求。它先从流中读取数据,解析请求头,然后把它交给某种语言的解释器,取回数据然后把数据写回流中。

如果用户关闭了浏览器,那么浏览器会提前关闭流,相当于往流里面写了个EOF。服务器肯定会往下执行,因为还是要写日志什么的,只是它读到EOF就不进行流的操作了。

littlehz
  • 2
新手上路,请多包涵

不知道你说的是PHP还是什么,是nginx还是apache还是fastcgi,另外前端代理怎么配的。每个server容器的处理方法不同,不要看经验,做个实验。写个PHP,while死循环,每sleep 1秒往一个文件里追加写一个当前时间,浏览器访问,然后关掉,看看文件是否继续写。

我印象中是关掉浏览器,服务器的PHP就不会执行了,所以PHP才会有ignore_user_abort()这个函数,忽略用户关掉浏览器的行为,让服务器执行完这个脚本。

这种不好控制吧,超时这种操作是在服务器端做吧

宣传栏