一直只知道不能有输出,具体理由还不知道。今天明白了。
由于 目前对 http 协议不是很清楚,所以不能具体说明。
例子:test.php
echo 'test';
header('content-type:text/html;charset=utf-8');
上面的代码 在 php.ini 中
output_buffering=Off 的时候会导致一个错误(关闭php默认缓存)
test.php 在执行的时候由于php缓存被关闭,所以他直接先把 test 输出 然后在去修改 头信息。
http协议有2个部分,一个是头信息部分和主题(body)部分,应该要先将头信息输出后在输出主题
由于在代码中 header不再第一行,因此 在访问 test.php 的时候 已经把头信息给输出掉了。
然后输出 test 之后在试图修改 头信息 此时已经无法修改头信息了 因此我们能看到这样一段错误
Warning: Cannot modify header information - headers already sent by (output started at D:\PHPnow-1.5.6\htdocs\test.php:2) in D:\PHPnow-1.5.6\htdocs\test.php on line 4
大概意思是在说 头信息无法修改。
下面抓包的图
头信息 content-type 为 text/html; 因为代码的第一行不是 header 解释时可能是认为没有对头信息进行修改 所以直接先输出了默认的头信息
在看下面的图
正文部分 输出了 11 之后 才发现 有一段 header 代码 试图修改了头信息,因为 头信息已经输出掉了 所以无法进行修改。
这只是一个警告非错误。
如果在php关闭了默认缓存的情况下 让上面的代码不发生错误 可以使用 php 缓存函数
ob_start();
echo 'test';
header('content-type:text/html;charset=utf-8');
echo 'tests';
ob_start 开启环迅,将页面的所有输出都丢到缓冲区。
此时 因为页面的输出会保存到缓冲区中 所以在执行 header 之前是没有任何输出。
那么在什么时候才会把缓冲区的内容释放出来呢? 应该是 4096 字节满了就会释放(这个好像可以修改)
要么手动释放。 如何判断他们是在缓冲区而没有输出?
$str = ob_get_contents();
他能返回缓冲区的内容,可以把这个内容写入到一个文件中进行查看。
顺便将常见的 缓存函数列出来
ob_clean -- > 清空缓冲区
ob_end_clen() --> 关闭缓冲同时清空缓冲区
ob_end_flush() --> 关闭缓存并输出缓冲区的内容
ob_flush() --> 输出缓冲区的内容 并清空缓冲区
flush(); --> 刷新程序缓存( 他是程序缓存,不是 ob缓存,php有2个缓存,一个是ob 一个是 程序)
for($i = 0; $i < 3; $i++) {
echo str_repeat(' ' , 256);
echo $i;
sleep(1);
flush();
}
这段代码如果没有flush (刷新程序缓存) 那么会等待50秒后才显示 0 - 49
因为循环没有结束时会把所有的 echo 都丢到 程序缓存中,当循环结束后 才会刷新程序缓存 把 0 - 49 一口气显示
但是现在每等待1秒中就刷新了程序缓存 所以 按道理 应该每过一秒就得看到一个数字被打印才对,但是使用看不到 还是和原来一样。
其实这不是 flush的问题,他确实刷新了程序缓存,只不过(如果你用的是ie) 浏览器也有自己的缓存,当页面输出的内容少于 256个字节时
是不会显示到文档中,这段代码稍微修改
for($i = 0; $i < 3; $i++) {
echo str_repeat(' ' , 256);
echo $i;
sleep(1);
flush();
}