php输出缓冲与http的联系

最近因为设计网站的时候需要实现一个后台处理的功能,在寻找解决方式的时候了解到了php输出缓冲的功能,让我第一次意识到http具体的传输数据都是什么流程(不会告诉你们我以前一直以为http只有一次数据传输的!),又get到一个新技能点,先记录下来,以后了解的多了再进一步补充吧


首先需要对以下函数有一定的了解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
获取当前php缓冲区的内容长度
*/
$size = ob_get_length()
/**
刷新php的输出缓冲区,也就是将当前缓冲区中的数据通过http来传输过去
然后至于这两个函数分别是什么功能。。我也不太清楚,网上倒是有不少介绍,反正就是一起用,起到刷新php
输出缓冲区的作用
*/
flush()
ob_flush()
/**
指定一个http流程中,一共需要接收多少数据,注意如果接收者还没有接收到指定的数据长度的时候就不会关闭
http链接,也就是浏览器窗口一直处于加载中的小圆圈
*/
header("Content-Length: xxx");
/**
指定一个http链接到目前接收的数据为止是否要关闭,但测试中发现,如果浏览器接受的数据没有达到指定长度
的时候,就算告诉了要关闭连接,http链接依然不会中断,所以我们在接下来实现中断http功能的过程中我们就
主要使用header("Content-Length: xxx");来实现,这个指定Connection状态的语句加不加随意吧
*/
header("Connection: close/keep-alive");
/*
指定脚本在失去http连接之后是否仍然要运行,也就是是否继续在后台运行。有一点要指明的是脚本不会注意到
http链接已经关闭,除非尝试echo一下,才能发现无法往缓冲区输出数据了
*/
ignore_user_abort(true);
/*
用于指定脚本的运行时限,0就是不限时间,因为想要后台运行的php脚本往往需要大量的时间,如果使用默认的
时间限制可能导致异常终止
*/
set_time_limit(0);

下面开始通过测试来分析php输出与http的关系

测试一

1
2
3
echo "hahaha";
sleep(10);
echo "hahaha";

结果:浏览器在等待了10s后接收到了一次数据,为”hahahahahaha”,看来php将两次数据都输出后统一进行了一次http传输

测试二

1
2
3
4
5
6
7
echo "hahaha";
ob_flush();
flush();
sleep(10s);
echo "hahaha";

结果:浏览器很快就接收到了第一次返回的数据————“hahaha”,又等待了10S后,返回了剩下的数据”hahaha”

测试三

1
2
3
4
5
6
7
echo "hahaha";
$size = ob_get_size();
header(Content-Length: {$size});
flush();
ob_flush();
echo "hahaha";

结果:浏览器很快就接收到了第一次返回的数据————“hahaha”,然后就停止了。原因就是我们通过指定这次传输中Content-Length的方式,让浏览器认为接收的数据已经够了,所以就终止了连接



综上所述

  • 我们可以通过flush(); ob_flush();来php输出缓存区的内容释放,然后进行一次http传输
  • 我们还可以在这次传输中通过指定header头Content-Length的方式来使整个的http链接终止
  • 然后我们还可以通过指定ignore_user_abort(true);来使php程序在http链接终止的时候继续运行,并为其设置运行时间限制set_time_limit(0);

以上就是实现php后台处理的思路啦