实现全站真静态化。
一般CMS系统都分为前台和后台, 前台系统是给用户看的,而后台则是管理员添加,修改,删除页面的地方。
在CMS系统中,前台一般都是html静态页面。
后台的责任是完成CRUD操作后更新静态页面。在更新静态页面的时候需要注意,是不是已更新完毕就立即更新,或者是定时更新。
通常例如Dede CMS系统和传智 CMS系统都是管理员手动点击更新(就是再走一遍控制器,使用ob缓存)。
或者想A67电影网是定时更新,一天更新一次而不是一但后台更新就生成新的页面。
需要记住的几点技巧:
1. 告诉后台你所要执行的是什么操作:
<!--隐藏区-->
<input type='hidden' name='oper' value='add'/>
例如上面的代码告诉浏览器我是要执行add的操作,这种方式通常都是在html中加入一段隐藏代码,不显示给用户。
2. 要了解系统基本结构:
CMS系统一般分为前台和后台。
前台多为html静态页面。后台有manager的登录页面和控制器。所有的crud操作都是在后台执行。
前台:
后台:
3. 最主要的是要了解缓存的机制:
PHP缓存技术一般有三种:
一种是ob缓存,第二种是程序缓存,第三种是浏览器缓存。
先了解什么是程序缓存:
如果在没有开启OB缓存的时候,那么所有的echo语句的输出都会放到程序缓存,自上而下的放置,到代码执行完毕之后会将程序缓存中的内容全部输出给浏览器显示。
但有个限制,header头文件必须出现在所有echo语句之前,一旦ob缓存没有开启,并且有echo语句出现在了header之前,那就会出错。
看一段代码:
<?php
echo "hello100"; header("content-type:text/html; charest=utf-8"); echo "hello200"; ?> |
说明:在php5.2版本中,在php.ini有一个配置 output_buffering,默认是关闭,如果是关闭的,则刚才的代码就会有警告。 Can not modify the header.
但需要说明的是:
程序并不是一执行就返回到浏览器,而是等代码执行完毕后,才会一起返回给浏览器。
如果一定想按照如此的次序放置,那么就得开启ob缓存,开启的方式是:
ob_start(); // 开启ob缓存
ob_get_contents(); //得到ob缓存中的内容
ob_clean(); //清空ob缓存中的内容
如果开启了ob缓存,那么:
所有echo的语句都会放到ob缓存中,所有header的语句就会放到程序缓存中。
等程序执行到最后,会将ob缓存中的东西全都添加到程序缓存的内容之后。
这样就可以解决问题,因为头在前面,数据在后面。
看几个例子,了解ob缓存:
- 如下程序则运行的结果?
<?php ob_start(); //open ob buffering echo "hello100"; header("content-type:text/html; charest=utf-8"); echo "hello200"; echo "hello300"; echo "hello400"; //ob_get_contents — 返回输出缓冲区(ob)的内容, 只是得到输出缓冲区的内容,但不清除它。 $str = ob_get_contents(); //把str保存到文件中 file_put_content("mylog.txt", $str); echo "hello500"; echo "hello600"; ?> |
在页面中:会输出hello100-hello600 |
在mylog文件中会保存hello100-hello300 |
4. 关于ob缓存其他的一些函数:
ob_end_clean: 清空(擦除)缓冲区并关闭(ob)输出缓冲。
Answer: 看到的是hello300 hello300 hello500 hello600
文件中的是: hello300 hello300
ob_end_flush: 冲刷出(送出)输出缓冲区内容并关闭缓冲。
Answer: 页面输出hello100-600
文件中输出的是:空 (因为ob缓存已经关闭)
说明:这个函数和ob_end_clean的区别是,ob_end_clean不输出ob缓存区中的内容,但是ob_end_flush则会输出其中的内容,但两者都会关闭缓存区中的内容。
ob_flush:冲刷出(送出)输出缓冲区中的内容, 但是不关闭缓存。
flush: 刷新输出缓冲, 把程序缓存的数据,强制刷新到浏览器缓存。
<?php echo str_repeat(' ',1024); for($i = 0; $i < 5; $i++){ echo $i; //强制吧程序缓存的数据,刷新到浏览器中去 flush(); sleep(1); //sleep 1 second } ?> |
程序会每隔一秒输出一个数字 |
注意:1. ob缓存先要禁用,如果不禁用,则echo的数据全都去ob缓存了,程序缓存中没有数据,那么这段程序将在5秒钟之后,将数据一同输出到页面中。
2. 一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。所以使用echo str_repeat(' ',1024);
3. 说明了浏览器缓存的存在。