Php output buffering缓存及程序缓存深入解析
发布时间:2020-12-13 06:30:46 所属栏目:PHP教程 来源:网络整理
导读:下面测试ob缓存和程序缓存: 在测试前为了测试效果更明显,我们在php.ini里先关闭ob缓存并设置明显的错误级别。 Display_errors=on 代码1: 代码如下: echo "php"; header("content-type:text/html;charset='utf-8'"); echo 'ok'; 则会出现 php Warning: Cann
下面测试ob缓存和程序缓存:在测试前为了测试效果更明显,我们在php.ini里先关闭ob缓存并设置明显的错误级别。Display_errors=on 代码1: 代码如下: echo "php"; header("content-type:text/html;charset='utf-8'"); echo 'ok'; 则会出现 php Warning: Cannot modify header information - headers already sent by (output started at D:wwwapachehtdocstestt2.php:2) in D:wwwapachehtdocstestt2.php on line 3 ok 代码2: 代码如下: ob_start(); echo "php"; header("content-type:text/html;charset='utf-8'"); echo 'ok'; 结果就完全正确了 代码1:Php在echo ‘php'时已经向浏览器发送一个头信息,当再出现 又看到一个头信息,这时已经打回了上面的头信息,无法更该便出错了。 代码2:开启了ob缓存,echo ‘php'时把要打给浏览器的数据先放到ob缓存里,之后又遇到一个头信息,也放入Ob缓存,页面结束时再按http协议到程序缓存后返回给浏览器。为加深理解再看以下代码 代码3: 代码如下: ob_start(); echo "php"; header("content-type:text/html;charset='utf-8'"); echo 'ok'; echo ' '; $ob=ob_get_contents(); echo $ob; 会输出
Ob_get_contents()只是取得ob缓存里的内容而不清楚它们 代码4: 代码如下: ob_start(); echo "php"; ob_clean();//清除缓存内容但不关闭缓存区,还能用(往里添加东西) header("content-type:text/html;charset='utf-8'"); echo 'ok'; echo ' '; $ob=ob_get_contents(); echo $ob; 结果: 代码如下: ob_start(); echo "php"; ob_end_clean();//清空缓存内容并关闭缓存区,ob_get_contents取不到内容 header("content-type:text/html;charset='utf-8'"); echo 'ok'; echo ' '; $ob=ob_get_contents(); echo $ob; 结果: 代码如下: ob_start(); echo "php"; ob_end_flush();//把缓存送到程序缓存内并关闭ob缓存 header("content-type:text/html;charset='utf-8'"); echo 'ok'; echo ' '; $ob=ob_get_contents(); echo $ob; 代码7:对比代码6 与ob_flush()比较 代码如下: ob_start(); echo "php"; ob_flush();//把Ob 缓存送到程序缓存,不关闭ob缓存 header("content-type:text/html;charset='utf-8'"); echo 'ok'; echo ' '; $ob=ob_get_contents(); echo $ob; 结果:清空ob缓存内容但不关闭 Ob_get_flush() 冲刷出缓存到程序缓存,关闭ob缓存 代码8: 代码如下: Ob_start(); echo 'abc'; header("content-type:text/html;charset='utf-8'"); echo 'hello'; Ob_flush(); echo 'aa'; echo ob_get_contents(); //abchelloaaaa 代码9: 代码如下: ob_start(); echo 'a'; flush();//把Ob缓存冲刷到程序缓存再冲刷到浏览器输出,不影响ob缓存 echo ob_get_contents(); //aa 代码10: 代码如下: ob_start(); echo 'a'; ob_flush();//把Ob缓存冲刷到程序缓存,ob里没有了缓存内容 echo " ob_con".ob_get_contents(); //a 是按正常输出的,Ob里没内容 程序缓存: 代码11: 代码如下: echo str_repeat(" ",1024);//一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。 for($i=0;$i<5;$i++){ echo $i; echo " "; sleep(1); flush(); } 会一秒输出一个数字 如果没有flush();会把所有的输出先暂存在程序缓存里,等完毕在整体返回给浏览器 这个例子说明了程序缓存 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |