原标题:浏览器退出或者关闭或者停止执行服务器上代码还会继续执行么?
这个问题很棘手,一般情况下我们的理解是肯定还会执行,但是究竟是不是真的这样呢?我们来做一个实验:
实验环境:windows10
实验条件:wampserver php5.5 apache2.4
下面直接贴代码:
写这样一段很简单的代码,然后在浏览器中运行,代码可以看出是死循环,就是说一直执行下去,每次都在a.txt中写一个hello字符串。然后在浏览器中我们执行有个几秒后,关闭浏览器或者关闭标签页或者直接停止执行当前页面,然后我们在找到a.txt文件,看里面的内容。我们发现内容还是会一直写入。但是,注意,最后,两分钟后a.txt就不再加入内容了。这是怎么回事呢?
我们继续研究,两分钟后a.txt不再追加内容了,这个两分钟从哪里来的?哪里设置了这个两分钟的值?
首先想到的肯定是apache的配置文件和php的配置文件。
先看apache的配置文件httpd.conf,找了整个文件里面没有此类设置。
再看php的配置文件php.ini,对,就是那个我们以前也经常知道并经常修改用来做实验的max_execution_time
原来如此。
这下问题搞清楚了,我们来总结一下:
浏览器关闭,退出,停止执行等操作在没有设置PHP的ignore_user_abort函数(至于怎么有这个函数的关系,可以自己找资料或者私信我)的值的情况下,是不会影响服务器端代码的继续执行的,服务器端代码的最终执行时间受自己配置的max_execution_time的影响,所以类似死循环类的代码它也会终结执行并不会一直执行下去到进程关闭或者服务器关机。这就是为什么会混淆的根源:客户端停止请求(一般人们就会以为服务器也停止了执行)但是服务器会继续执行下去,如果超过执行最大时长max_execution_time则php也就会自动停止执行但这个停止执行并不是浏览器关闭导致停止的。
服务器端没执行完,浏览器停止执行,浏览器也会收到服务器端执行过的数据,例如死循环中不停给数组加数据1-10000,执行到5000浏览器就停止请求了,那么浏览器会收到5000个数据而不会一个都收不到。这个问题需要深究,还可以写另一篇博客。
参考资料:
知识得来不易,谢谢您支持鼓励
责任编辑: