摘要:事件起因是因为平时在开发中遇到的疑惑。一次是浏览器客户端主动断开了连接后,发现服务器端的php脚本还在执行,以至于不知道怎样让脚本停下来。还有一次是有需求让php脚本主动断开连接,然后后续脚本继续执行(一个耗时任务),所以有了这篇博客。
一、浏览器主动断开连接
在常用的LAMP组合下,我们认为,浏览器访问一个php脚本,脚本开始执行,脚本输出内容,并结束运行,apache响应http,浏览器收到http响应,显示结果。
下来考虑下特殊的情况。
1、浏览器发送http请求,php执行了一个耗时任务(20s)(假设php的set_time_limit设置的是30s),在此期间浏览器无响应,用户点击浏览器X,浏览器主动断开连接,php脚本是否还继续运行。
假设耗时任务是:计算fib(25),浏览器测试响应需要时间1.15s,每执行一次耗时任务,写文件Log写一次,执行10次耗时任务,在执行第5次的时候,客户端主动断开连接,观察情况。
代码如下:
<?php
for ($i=0; $i < 10; $i++) {
fib(25);
setLog(date('H:i:s'));
}
function fib($n = 3){
if($n == 0){
return 1;
}
if($n == 1){
return 1;
}
return fib($n -