为什么要是用静态页面?因为对于一个访问量可能达百万、千万级别的网站来说,每次用户点击动态链接的时候都会对服务器发送数据查询的要求,这无疑是服务器一个大大的负担!就算是访问量级没那么大,每次都请求数据库,也是一个不太好的选择,所以把动态数据转换成静态的html页面,从一定程度上就可以减少对数据库的压力,用PHP生成静态页面也成了一个刚需。。
怎么生成静态页面呢?
第一种:利用模板。
目前PHP的模板可以说是很多了,有功能强大的smarty,还有简单易用的smarttemplate等。它们每一种模板,都有一个获取输出内容的函数。我们生成静态页面的方法,就是利用了这个函数。用这个方法的优点是,代码比较清晰,可读性好。
这里我用smarty做例子,说明如何生成静态页:
<?php require_once('Smarty/Smarty.class.php'); $smarty = new Smarty(); //用于存放smarty模版文件,如果未指定该路径,Smarty会自动在当前目录中寻找模版文件。 $smarty->template_dir = 'templates/'; //用于存放smarty编译后的文件,如果不指定该目录,Smarty会自动在当前脚本所在目录下生成一个名为'templates_c'的目录用于存放生成的编译文件。 $smarty->compile_dir = 'templates_c/'; //用于存放smarty配置文件 $smarty->config_dir = 'smaconfigs/'; //用于存放smarty缓存文件,如果开启Smarty缓存功能,但没有指定该目录,Smarty会自动在当前脚本所在目录下生成一个名为'cache'的目录用于存放缓存文件。 $smarty->cache_dir = 'cache/'; $smarty->assign("name","Hello World!"); $content = $smarty->fetch("templates/index.tpl"); //这里的 fetch() 就是获取输出内容的函数,现在$content变量里面,就是要显示的内容了 $fp = fopen("test.html", "w"); fwrite($fp, $content); fclose($fp);
第二种方法:利用ob系列的函数。
这里用到的函数主要是 ob_start(), ob_end_flush(), ob_get_content(),其中ob_start()是打开浏览器缓冲区的意思,打开缓冲后,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区,直到你使用了ob_end_flush().而这里最重要的一个函数,就是ob_get_contents(),这个函数的作用是获取缓冲区的内容,相当于上面的那个fetch(),道理一样的。
<?php ob_start(); echo "Hello World!"; $content = ob_get_contents();//取得php页面输出的全部内容 $fp = fopen("staticPage.html", "w"); fwrite($fp, $content); fclose($fp);
ob是output buffering的意思 也就是输出缓存。
当你准备输出的时候 所有的数据都保存在ob里面 服务器解析完php以后 把所有要输出到客户端的html代码都存放在ob里面 如果我们要输出html静态页面 只要把缓存取出来写入一个html页面即可。
ob系列函数: ob_start():开始“捕捉”缓存 也就是从这里开始 打开浏览器的缓存 ob_end_flush():关闭浏览器缓存 ob_get_content():读取缓存内容 fopen(”文件路径”,”打开模式”)打开文件 这个函数的打开模式有好几种 下面介绍几种主要的模式: “r” 只读方式打开,将文件指针指向文件头。 “r+” 读写方式打开,将文件指针指向文件头。 “w” 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 “w+” 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 fwrite(”文件名称”,”写入内容”) 写入文件 fclose() 关闭文件
触发系统生成纯静态化页面
方法:页面添加缓存时间;手动触发
页面添加缓存时间
<?php $file_name = 'test.html'; if(file_exists( $file_name ) && filemtime( $file_name ) - time() < 10 ){//如果文件是存在并且最后修改时间小于设定时间 10s //filemtime( $file_name );//得到文件最后修改时间 //time();//当前时间 require_once( $file_name );//引入文件 } else { ob_start(); } ?> <p>我是要生成的静态内容</p> <?php file_put_contents( $file_name, ob_get_contents() );//输出到浏览器 ?>
如果后台数据存在更细,定时刷新不能及时更改静态页面,怎么办?所有引入了手动触发的功能
手动触发
手动触发的大概样式就类似于优酷视频评论区,当有新评论时,会后一条屎黄屎黄的小提示框:“有新评论,点击更新”,也类似于app中的下滑刷新的机制,自己去寻找吧。。
除此之外还有Linux下的crontab定时扫描程序
*/5 * * * * php /index.php
本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn