少用但始终都会碰到 - 已发送的header

  • 作者:KK

  • 发表日期:2016.12.4


要点速读

  1. header函数发送过的响应头都能通过headers_list函数获取

  2. header后再headers_sent返回false是因为开了缓冲区,要先flush才会返回true

  3. 判断能不能再header发送响应头,要判断一下headers_sent返回的是不是true


headers_list函数获取已发送的header

使用headers_list();即可,例:

print_r(headers_list()); //默认有PHP版本的header输出
header('xx:yy');
print_r(headers_list()); // 增加了 xx:yy 这个元素

判断是否发送过header

虽然headers_sent();返回true/false表示是否发送过header

但你可能会发现它总返回false,原因就是PHP默认是开启了缓冲区的,所以一般所有header函数发出的响应头都会进入缓冲区,并没真正传给客户端,需要执行flush();将缓冲区的数据送出去,这样headers_sent才会根据实际情况返回true/false

例:

var_dump(headers_sent()); //false
header('xx:yy');
var_dump(headers_sent()); //还是 false
flush();
var_dump(headers_sent()); //true

解释为什么有时候echo后执行header不会报错

相信每一位同学在当初学习过程中都学习过,echo输出后再执行header是会报错的,但是在实际工作中偶尔会发现不会报错

其实上面也解释了这个,我这里就是明确说一下,就是echo时也是输出到缓冲区的,所以并没有真正发给客户端,那你还是能在后续操作中发header的

而那些echo后不能发header的情况,就是因为缓冲区默认关闭了造成的


判断是否能发送header的依据

虽然echo过,但是headers_sent返回false说明是开启了缓冲区的,那你可以放心继续执行header函数发送更多响应头

其实无论缓冲区是否开启,你只要根据headers_sent返回的是不是true来决定是否继续发送header就行了