php 页面关了还在执行,为什么浏览器关闭后PHP还会一直执行啊

127.0.0.1/a.php

set_time_limit(0);

while (true) {

file_put_contents('./a', "data\r\n", FILE_APPEND);

sleep(1);

}

我关闭浏览器后为什么发现a文件还在写啊,我删了a文件还是会继续生成,不是说关闭连接后PHP默认终止脚本吗?

但是前提是你对

ignore_user_abort()

函数是否设置为

false

,如果为

true

,那么当用户关闭浏览器后,php页面还会继续执行!同时发现你对页面设置了

set_time_limit(0),

就是说脚本不会超时!只要调整

ignore_user_abort()

就好了

浏览器发起请求,然后服务器开始执行,一直执行到服务器脚步运行完毕或者出现异常或者TIMEOUT。浏览器没法关闭服务器的运行。

但是……

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

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

https://segmentfault.com/q/1010000000627…

是使用

nginx + php

还是

apache + php

,还是其他

webserver + php

nginx + php

,严格的说是

phpfpm + php

的确会出现这个情况

PHP在发送信息给客户端时,才能检测连接是否已经中断.

http://php.net/manual/zh/function.ignore…

php.ini中ignore_user_abort默认是Off,不忽略用户的中断,也就是客户端断开连接后,脚本将被中止.

在PHP尝试发送信息到客户端之前,不会检测到用户是否已中断连接.

仅使用echo语句不能确保信息已发送,参见flush()函数.

info.php

<?php

for($i=0;$i<5;$i++) {

sleep(1);

}

file_put_contents('/tmp/info.txt', $i);

测试:

time curl http://127.0.0.1/info.php

Ctrl+C中断请求(PHP-FPM)最后还是生成了文件info.txt.

因为该请求没有输出,PHP无法检测用户是否已中断连接.

PHP在发送信息给浏览器时,才能检测连接是否已经中断.

比如执行这段代码,在5秒内中断请求,将不会生成文件info.txt:

for($i=0;$i<5;$i++) {

echo $i;

ob_flush();

flush();

sleep(1);

}

file_put_contents('/tmp/info.txt', $i);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值