少用但始终都会碰到 - 已发送的header ¶
作者:KK
发表日期:2016.12.4
要点速读 ¶
header函数发送过的响应头都能通过
headers_list
函数获取header后再headers_sent返回false是因为开了缓冲区,要先flush才会返回true
判断能不能再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就行了