页面静态化思路:

因为新闻这种信息对实时性要求不高,并且比较稳定,所以可以这样做:当地一个用户访问某条新闻后,我们使用ob缓存机制,将内容缓存到html页面。当下一次访问时候,直接访问html页面。这样减少访问数据库次数,提高程序的效率,但是如果新闻内容修改,html静态页面必须实时改变,此处将html静态页面设定30s的过期时间,这样确保hrml静态页面和新闻的一直性,但是有30s延迟,没法保证实时性。

程序代码如下:

(1)数据库操作的类文件 ConnDB.class.php

<?php
/**
* Created by PhpStorm.
* User: 58
* Date: 2016/8/5
* Time: 8:57
*/
class ConnDB{
private static $host = '127.0.0.1';
private static $username = 'root';
private static $password = '7758521Lhy';
private static $db = 'test';
private $conn = null; public function __construct(){
$this->conn = new MySQLi(self::$host,self::$username,self::$password,self::$db);
if(!$this->conn){
echo '数据库连接错误:'.$this->conn->connect_error;
exit();
}
$this->conn->query("set names utf-8");
} public function execute_dql($sql){
$rs = $this->conn->query($sql) or die('查询出错!'.$this->conn->error);
$rsList = array();
if($rs){
while($row = $rs->fetch_assoc()){
$rsList[] = $row;
}
}
$rs->free();
return $rsList;
} public function execute_dml($sql){
$rs = $this->conn->query($sql);
if(!$rs){
$flag = 0;
}else if($this->conn->affected_rows){
$flag = 1;
}else{
$flag = 2;
}
return $flag;
} public function clossDB(){
if($this->conn){
$this->conn->close();
}
}
}

(2)新闻列表显示页面 news_list.php

<?php
/**
* Created by PhpStorm.
* User: 58
* Date: 2016/8/5
* Time: 15:31
*/
header("Content-Type:text/html;charset=utf-8");
require_once "ConnDB.class.php";
$conn = new ConnDB();
$sql = "select * from news";
$rs = $conn->execute_dql($sql);
$conn->clossDB();
ob_start();
echo "
<a href='add_news.php'>发布文章</a>
<table border='1'>
<tr><th>id</th><th>标题</th><th>详细内容</th></tr>"; foreach($rs as $row){
echo "<tr><td>{$row['id']}</td><td>{$row['title']}</td><td><a href='show_news.php?id={$row['id']}'>详细内容</a></td></tr>";
}
echo "
</table>
";

  

(3)单条新闻显示页面show_news.php

<?php
/**
* Created by PhpStorm.
* User: 58
* Date: 2016/8/5
* Time: 9:40
*/
header("Content-Type:text/html;charset=utf-8");
$id = $_GET['id'];
$html_filename = "news_id".$id.".html";
//新闻如果更新,静态页面无法更新,可以设定静态页面过期时间30s,这样30s后,重新生成新的静态页面,
//这样保证静态页面和新闻的一致性,但是没法确保实时性
if(file_exists($html_filename) && filemtime($html_filename)+30 > time()){
echo file_get_contents($html_filename);
exit();
}
require_once "ConnDB.class.php";
$conn = new ConnDB();
$sql = "select * from news where id = {$id} limit 1";
$rs = $conn->execute_dql($sql);
$conn->clossDB();
if($rs){
ob_start();
$row = $rs[0]; echo "
<table border='1'>
<tr><th>{$row['title']}</th></tr>
<tr><td>{$row['content']}</td></tr>
</table>
";
$html_contents = ob_get_contents();
$html_header = "<head><meta http-equiv='content-type=text/html;charset=utf-8'></head>"; file_put_contents($html_filename,$html_header.$html_contents);
}

  

  

单纯使用缓存技术存在的不足:

(1)news_list.php中点击“详细内容”时候,跳转到html静态页面时候,显示php页面。比如打开news_id1.html页面时候,地址栏显示http://127.0.0.1/show_news.php?id=1

(2)实时性不完美,存在30s延时。

可以使用真静态技术解决此问题。

最新文章

  1. .Net Core WebAPI 基于Task的同步&amp;异步编程快速入门
  2. solaris查看内存、CUP、硬盘总数和使用情况
  3. 泛型的上限和下限的Demo
  4. 基于LoadRunner构建接口测试框架
  5. paas架构之docker——安装
  6. SQL Server 中的触发器(trigger)
  7. HTTP详解(1)-工作原理
  8. 【Redis】使用Redis Sentinel实现Redis HA
  9. 域控制器中的FSMO角色
  10. 百度地图API的使用方法
  11. C# double float int string 与 byte数组 相互转化
  12. Oracle OEM重建
  13. 使用curl下载文件
  14. 手动实现 NSTabViewController 的 Rect Transition 及 Propagate Title-b
  15. HDOJ 2665 Kth number
  16. C#实现eval
  17. echarts的部署和使用
  18. [Find the last digit when factorial of A divides factorial of B]
  19. [bzoj1273] [BeiJingWc2008]序列
  20. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU特性介绍(2)- RT1052DVL6性能实测

热门文章

  1. yaf框架安装配置
  2. Linux 添加硬盘
  3. Linux系统 SecureCRT SecureFX 注册破解方法
  4. 关于MySQL在内网中使用另一台机器访问的问题
  5. android 弹出软键盘将底部视图顶起问题
  6. Spring boot变量的初始化顺序
  7. cmake-mark_as_advanced
  8. Linux Bash命令总结
  9. Windows 下安装ReText
  10. Python + Robotframework + Appium 之APP自动化测试实践(一)