您当前的位置: 首页 > 学无止境 > 网站建设 网站首页网站建设
php页面静态化-缓存机制详解
发布时间:2015-10-08 08:26:07编辑:雪饮阅读()
要测试php自身的页面静态化缓存技术需要配置php.ini文件如下:
Display_error=on
Output_buffering=off
Error_reporting=”错误级别”(如“error_reporting = E_ALL & ~E_NOTICE”)
Apache不读php.ini此文件是php处理模块读取的
开启缓存之后输出的“yyy”和“hello”将被缓存到如图所示位置
没有开启缓存之前php输出的信息会覆盖掉黑色那一块的信息,这样就导致header无法正常运行,开启缓存后下面的白色区域将会显示相关信息
关闭Output_buffering=off缓存之后,php中在header语句之前的echo语句会直接返回到http响应的内容区域,此时已经有了默认的http头信息生成,而接着的header语句就需要更改http头信息,但实际上更改头信息应该是在头信息没有生成之前更改的,此时已经无法修改了,所以会报错。
ob_start()开启Output_buffering缓存之后,所有原本直接返回http响应内容的信息都将先返回到缓存区域中,最后才开始执行header语句修改头信息并将所有缓存区域信息和头信息生成。
此缓存机制由php模块处理
若在缓存开启下将一部分echo语句缓存并将头信息生成,然后关闭缓存,此时再次写一个header则会再次报错,因为缓存开启时已经缓存了头信息和http响应内容。而关闭了缓存时头信息已经生成。若没有关闭缓存并再次写header语句则不会报错,新的header会在缓存中更改之前的header头信息。而关闭缓存后普通的echo语句还可以继续输出。这是因为程序缓存的原因。ob_end_clean()将缓存清空并关闭后,新的语句就会进入程序缓存,程序缓存中echo必须在header之后了,否则就会报错了。
源码案例1:
<?php
//开启缓存防止header报错(通过php.ini也可以在页面ob_start())
ob_start();
echo "yyy";
header("Content-type:text/html;charset=utf-8");
echo "hello";
ob_clean();
//ob_clean()函数可以清空outputbuffer的内容
//只能说是内容被清理没有了,header信息还在
//ob_get_contents()可以获取Output_buffering的内容
ob_end_clean();
//关闭ob缓存空间,同时清空outputbuffer内容
$contents=ob_get_contents();
echo "<hr/>";
echo $contents;
file_put_contents("d:/xy.txt",$contents);//输出信息到文件中
?>
源码案例2:
<?php
//开启缓存防止header报错(通过php.ini也可以在页面ob_start())
ob_start();
echo "yyy";
header("Content-type:text/html;charset=utf-8");
echo "hello";
//ob_clean();
//ob_clean()函数可以清空outputbuffer的内容
//只能说是内容被清理没有了,header信息还在
//ob_get_contents()可以获取Output_buffering的内容
ob_end_clean();
echo "你好";
header("Content-type:text/html;charset=utf-8");
?>
源码案例3:
<?php
ob_start();
echo "yyy";
header("Content-type:text/html;charset=utf-8;");
echo "hello";
ob_end_flush();//输出ob缓存并关闭
ob_flush();//刷新缓存
echo "kkk";
?>
源码案例4:
<?php
//ob_flush和flush的区别
//证明程序缓存存在
echo str_repeat("",1024);
for($i=0;$i<6;$i++){
echo $i;
//sleep休眠1秒
sleep(1);
//flush()函数是刷新程序缓存的内容
flush();
}
?>
测试题目1:
<?php
ob_start();
echo "abc";
header("Content-type:text/html;charset=utf-8;");
echo "hello";
ob_clean();
echo "aa";
header("Content-type:text/html;charset=utf-8;");
?>
测试题目2:
<?php
ob_start();
echo "abc";
header("Content-type:text/html;charset=utf-8;");
echo "hello";
ob_end_clean();
echo "aa";
header("Content-type:text/html;charset=utf-8;");
?>
测试题目3:
<?php
ob_start();
echo "abc";
header("Content-type:text/html;charset=utf-8;");
echo "hello";
ob_flush();//输出并清空
echo "aa";
echo ob_get_contents();
?>
测试题目4:
<?php
ob_start();
echo "abc";
header("Content-type:text/html;charset=utf-8;");
echo "hello";
ob_end_flush();//输出并关闭
echo "aa";
echo ob_get_contents();
?>
关键字词:静态化,缓存机制,个人博客
上一篇:php中多异常的理解
下一篇:使用php缓存机制-页面静态化