用PHP如何实现页面静态化

为什么要静态化页面

用户访问一个不经常更新的Web页面PHP接到指示对PHP脚本文件进行解析,从数据库查询到该页面所需要的数据,然后对页面模板进行渲染,最后将一个成品页面展示给用户

单次请求对于服务器来说非常简单,处理起来非常快,但是如果同时有成千上万各用户请求该页面呢?这无疑是对资源的一种浪费,这就是我们要做静态的目的。

静态化分为纯静态与伪静态,纯静态又分为局部纯静态和全部纯静态。

伪静态

伪静态顾名思义,它并不是真的静态页面而是伪装的。例如一个PHP作为后端语言的web站点,正常情况下他的url应当是类似于http://www.example.com/index.PHP

当我们做了伪静态处理后,当你访问同一个页面它展示的url可能就是http://www.example.com/index.html了。

它的作用是路由简化,能够更好的被搜索引擎收录,当你不想让用户知道你的后端语言时也可以采用这种方法

纯静态

局部纯静态

一个页面通常由多个部分组成,例如一个博客,他可能由正文、分类友情链接、栏目等部分组成。当有些部分更新频繁,而有些部分不常更新时就可以采用局部静态化

全部纯静态

看了前面的内容这个就很容易理解了,当一个页面所有内容都不常更新即采用这种方式。

静态化页面实现原理

首先要说的是一个叫做缓冲器(buffer)的东西。

举个简单的例子说明它的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer写满或者执行了保存操作,才会将数据写入磁盘。

对于PHP来说,每一次像 echo 这样的输出操作,同样是先写入到了 PHP buffer 里,在脚本执行完毕或者执行了强制输出缓存操作,数据才会在浏览器上显示

对于这个缓冲区,在PHP输出内容之前,我们取出缓冲区的内容(这里就是渲染好的模板内容了),然后将其写入一个静态文件中并设置过期时间,当下次用户访问该页面的时候,如果该静态文件存在并且在有效期内,我们就直接将该静态文件展示给用户看,否则重写静态文件

代码实现

数据库连接,用到了单例模式。

Database.PHP

<?PHP

class Database {

//用于保存实例化对象

private static $instance;

//用于保存数据库句柄

private $db = null;

//禁止直接实例化,负责数据库连接,将数据库连接句柄保存至私有变量$db

private function __construct($options) {

$this->db = MysqLi_connect($options['db_host'], $options['db_user'], $options['db_password'], $options['db_database']);

}

//负责实例化数据库类,返回实例化后的对象

public static function getInstance($options) {

if (!(self::$instance instanceof self)) {

self::$instance = new self($options);

}

return self::$instance;

}

//获取数据库连接句柄

public function db() {

return $this->db;

}

//禁止克隆

private function __clone() {

// Todo: Implement __clone() method.

}

//禁止重构

private function __wakeup() {

// Todo: Implement __wakeup() method.

}

}

用于静态化页面

Cache.PHP

<?PHP

class Cache {

public function index($options) {

//判断文件是否存在,判断是否过期

if (is_file('shtml/index.shtml') && (time() - filemtime('shtml/index.shtml') < 300)) {

require_once ('index.shtml');

}else {

require_once ('Database.PHP');

$con = Database::getInstance($options)->db();

$sql = "SELECT * FROM pro_test";

$exe_res = MysqLi_query($con, $sql);

$res = MysqLi_fetch_all($exe_res);

try{

if (!$res) {

throw new Exception("no result");

}

}catch (Exception $e) {

echo 'Message: ' .$e->getMessage();

}

//开启缓存区,这后面的内容都会进缓存区

ob_start();

//引入模板文件(模板会渲染数据)

require_once ('templates/index.PHP');

//取出缓存区内容在这里是渲染后的模板),将其保存(认会覆盖原来的)为index.shtml(static html)

file_put_contents('shtml/index.shtml', ob_get_contents());

}

}

}

//数据库配置信息

$options = [

'db_host' => 'MysqL',

'db_user' => 'root',

'db_password' => 'localhost',

'db_database' => 'pro_shop',

];

$obj = new Cache();

$obj->index($options);template/index.PHP

<!DOCTYPE>

<html>

<head>

<Meta charset="UTF-8">

<title>首页</title>

</head>

<body>

<?PHP foreach ($res as $item) {?>

<div>姓名:<?PHP echo $item[1]?></div>

<div>密码:<?PHP echo $item[2]?></div>

<?PHP }?>

</body>

</html>浏览器访问 localhost/Cache.PHP

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...