Php生成静态页面

    为什么要是用静态页面?因为对于一个访问量可能达百万、千万级别的网站来说,每次用户点击动态链接的时候都会对服务器发送数据查询的要求,这无疑是服务器一个大大的负担!就算是访问量级没那么大,每次都请求数据库,也是一个不太好的选择,所以把动态数据转换成静态的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

冷暖自知一抹茶ck
请先登录后发表评论
  • 最新评论
  • 总共0条评论