大流量程序设计与实现--系列二
五、页面静态化技术实现由两种方式
1. php自己的缓存机制
1.1 ob缓存的机制
ob1.php
<?php
//开启ob缓存
ob_start();
echo "hello100";
header("content-type:text/html;charset=utf-8");
echo "hello200";
//ob_clean()清空ob中数据
//ob_clean();
//该函数是清空ob中数据,并关闭ob缓存
//ob_clean();
//把ob缓存的数据,刷新到程序缓存,同时关闭ob
//ob_end_flush();
//把ob缓存数据,刷新到程序,不关闭ob
ob_flush();
echo "hello300"
//获取ob缓存的数据
$str = ob_get_contents();
//把$str保存到文件中
file_put_contents("a.log", $str);
echo "hello500"
echo "hello600"
程序缓存
content-type:text/html;charset=utf-8
hello100
hello200
hello300
hello500
hello600
ob2.php 浏览器缓存(浏览器缓存存在)
<?php
// flush()作用:把程序缓存的数据,强制刷新到浏览器缓存.
//str_repeat(); 重复地输出多次字符
echo str_repeat('', 1024);
for($i=0;$i<5;$i++){
echo $i;
// 把程序缓存的数据,强制刷新到浏览器缓存.
flush();
//休眠1秒钟,在sleep这个过程中,http链接没有断
sleep(1);
}
//如果不打开ob缓存,那么就只有程序缓存,
//可是事实上是:隔5s就一下子,浏览器就输出01234
//原因是:浏览器优化了,会接受255字字符后才开始输出
//那怎么实现:每隔一秒,浏览器就输出一个字符呢,就用str_repead
1.2//sns实时推数据到客户端,就是用这个sleep函数,保持长连接
1.3 练习
1.3.0
<?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");
//程序将输出aa,因为前面的被ob_clean();清理掉了
1.3.1
<?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");
//仍然是aa
1.3.2
<?php
ob_start();
echo "abc";
header("content-type:text/html;charset=utf-8");
echo "hello";
ob_flush();
echo "aa";
echo ob_get_contents();
//结果:abchelloaaaa
//因为:abchello是ob_flush()刷入了程序缓存,然后echo "aa"就会把aa放到ob缓存
//然后ob_get_contents()得到aa,再echo,就是再次放入ob缓存,最终就有两个aa。
1.3.3
<?php
ob_start();
echo "abc";
header("content-type:text/html;charset=utf-8");
echo "hello";
ob_end_flush();
echo "aa";
echo ob_get_contents();
//结果:abchelloaa
//原因:ob_end_flush()关闭了ob,ob_get_flush()就为空了
1.4.缓存原则
1.4.1.如果ob缓存打开,则echo的数据首先放在ob缓存.
1.4.2.如果是header信息,就直接放在程序缓存
1.4.3. 当页面执行到最后,会把ob缓存的数据,放到程序缓存,然后一次返回给浏览器
2. 使用模板替换技术实现(正则表达式)
待发布......