1:首先,说下个人对页面静态化的理解:
页面静态化,说简单点儿,就是将原本需要xxx.php文件接收参数,访问数据库,调用view显示,这个过程,转化成一个xxx.html的静态文件的一种技术,这里有两种常见的实现方式。
2:页面静态化的好处:
显然,静态化的html文件,不再需要访问数据库,不再需要php模块解析,访问速度快,是其最显著的一个特点。
其次,不再访问数据库,对于紧俏的数据库资源,和web开发数据库的瓶颈问题,也有很大程度的改善。
而且呢,静态化的html页面,较之php页面,更有利于百度的spider抓取,有利于SEO。
3:页面静态化的实现:
常见的实现方式有两种:(1)利用php的ob缓存机制。(2)利用正则表达式或者字符串替代等方式替换模板文件。
4:ob缓存实现页面静态化
4.1:ob缓存的原理
web开发中,存在3个有缓存的地方。
(1)浏览器端的缓存。在后端返回数据但没有断开连接的时候,浏览器往往在接受到256个字符之后才解析和显示。可参见flush()函数。
(2)程序缓存。php模块,在解析php代码的过程中,并非是遇到一个显示输出就马上输出的,如echo函数。而是在代码完全解析之后,一次性的将数据返回给浏览器。
(3)ob缓存,需开启。php.ini中的设置选项为:output_buffer。可以形象的将其理解为一个容器。在php解析的过程中,将需要输出的内容暂时保存在这个容器中,而那些变量则保存在程序缓存中。当解析完成之后,再将容器的内容,放到程序缓存,再由程序缓存之后返回给浏览器。
而,我们正是在ob这个容器将内容给予程序缓存的时候,将其内容获取,转存成一个xxx.html的静态文件。这是ob实现页面静态化的原理。代码如下:
5:利用正则表达式或者字符串替代等方式替换模板文件的方式实现页面静态化
5.1:实现原理:
此处利用的是smarty模板的原理。实现准备好一个xxx.tpl的模板文件。(实际上就是一个html文件)。形如:
php代码部分,如图:
6:几点注意:
6.1 静态文件的命名:
我们往往在文件名中包含一定的信息,如通过主键。如:新闻,news-id-1.html,news-id-2.html
6.2 文件的存放:
假设一种极端的情况。假设你有1亿条新闻。如果这1亿个news-id-xxx.html文件存放在了同一个目录,那么,此时的问题,也许不在于高并发的访问数据库。而在于php磁盘寻找特定的html文件。简言之:目录下的文件太多,查找太费时间或者内存。
6.3 方式二里的 fopen方式,此处需要注意。
7:页面静态化后的几点分析:
7.1:缺点:
7.1.1 数据的实时性。这个是静态化的一个严重问题。更新或新添加的数据不能实时显示出来。
7.1.2 浪费磁盘空间。
7.2:解决方式:(此处只是个人观点)
7.2.1 先说磁盘。这个问题对于很多人,或者很多公司,可能都不是问题。想想也是,较之数据库问题和内存问题,硬盘确实不算问题。。。
8:页面静态化的实时性:
实时性差,是页面静态化的一个显著缺点。
根据 filemtile 设置过期时间,个人感觉也不是个太好的方式。虽然,我们可以写一个递归更新缓存的借口,在Linux使用job,CURL的方式每天凌晨更新也很好实现。
其实,这个问题要分开看。像新闻,文章这样的,静态化之后,基本不会变化的,不予考虑。
而对于页面中部分变化的部分,个人感觉可以部分静态化。
也有些做法,再数据更新的时候,就更新对应的静态化文件。这样是解决了实时性。但,确定操作和对应HTML文件的规则,却又成了难题。
9:希望得到一些解决页面静态化以后实时性问题的思路和方案。欢迎留言和讨论