> 백엔드 개발 > PHP 튜토리얼 > 为什么浏览器关闭后PHP还会一直执行啊

为什么浏览器关闭后PHP还会一直执行啊

WBOY
풀어 주다: 2016-06-06 20:12:44
원래의
1109명이 탐색했습니다.

<code>127.0.0.1/a.php

set_time_limit(0);
while (true) {
    file_put_contents('./a', "data\r\n", FILE_APPEND);
    sleep(1);
}</code>
로그인 후 복사
로그인 후 복사

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

回复内容:

<code>127.0.0.1/a.php

set_time_limit(0);
while (true) {
    file_put_contents('./a', "data\r\n", FILE_APPEND);
    sleep(1);
}</code>
로그인 후 복사
로그인 후 복사

我关闭浏览器后为什么发现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

<code><?php for($i=0;$i<5;$i++) {
    sleep(1);
}
file_put_contents('/tmp/info.txt', $i);
</code></code>
로그인 후 복사

测试:
time curl http://127.0.0.1/info.php
Ctrl+C中断请求(PHP-FPM)最后还是生成了文件info.txt.
因为该请求没有输出,PHP无法检测用户是否已中断连接.

PHP在发送信息给浏览器时,才能检测连接是否已经中断.
比如执行这段代码,在5秒内中断请求,将不会生成文件info.txt:

<code>for($i=0;$i</code>
로그인 후 복사
관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿