php 缓存工具类 实现网页缓存
php 缓存工具类 实现网页缓存
php程序在抵抗大流量访问的时候动态网站往往都是难以招架,所以要引入缓存机制,一般情况下有两种类型缓存
一、文件缓存
二、数据查询结果缓存,使用内存来实现高速缓存
本例主要使用文件缓存。
主要原理使用缓存函数来存储网页显示结果,如果在规定时间里再次调用则可以加载缓存文件。
工具类代码:
// 文件缓存类
class Cache {
/**
* $dir : 缓存文件存放目录
* $lifetime : 缓存文件有效期,单位为秒
* $cacheid : 缓存文件路径,包含文件名
* $ext : 缓存文件扩展名(可以不用),这里使用是为了查看文件方便
*/
private $dir;
private $lifetime;
private $cacheid;
private $ext;
/**
* 析构函数,检查缓存目录是否有效,默认赋值
*/
function __construct($dir = '', $lifetime = 1800) {
if ($this->dir_isvalid ( $dir )) {
$this->dir = $dir;
$this->lifetime = $lifetime;
$this->ext = '.Php';
$this->cacheid = $this->getcacheid ();
}
}
/**
* 检查缓存是否有效
*/
private function isvalid() {
if (! file_exists ( $this->cacheid ))
return false;
if (! (@$mtime = filemtime ( $this->cacheid )))
return false;
if (mktime () - $mtime > $this->lifetime)
return false;
return true;
}
/**
* 写入缓存
* $mode == 0 , 以浏览器缓存的方式取得页面内容
* $mode == 1 , 以直接赋值(通过$content参数接收)的方式取得页面内容
* $mode == 2 , 以本地读取(fopen ile_get_contents)的方式取得页面内容(似乎这种方式没什么必要)
*/
public function write($mode = 0, $content = '') {
switch ($mode) {
case 0 :
$content = ob_get_contents ();
break;
default :
break;
}
ob_end_flush ();
try {
file_put_contents ( $this->cacheid, $content );
} catch ( Exception $e ) {
$this->error ( '写入缓存失败!请检查目录权限!' );
}
}
/**
* 加载缓存
* exit() 载入缓存后终止原页面程序的执行,缓存无效则运行原页面程序生成缓存
* ob_start() 开启浏览器缓存用于在页面结尾处取得页面内容
*/
public function load() {
if ($this->isvalid ()) {
// 以下两种方式,哪种方式好?????
require_once ($this->cacheid);
echo "<!--缓存-->";
// echo file_get_contents($this->cacheid);
exit ();
} else {
ob_start ();
}
}
/**
* 清除缓存
*/
public function clean() {
try {
unlink ( $this->cacheid );
} catch ( Exception $e ) {
$this->error ( '清除缓存文件失败!请检查目录权限!' );
}
}
/**
* 取得缓存文件路径
*/
private function getcacheid() {
return $this->dir . md5 ( $this->geturl () ) . $this->ext;
}
/**
* 检查目录是否存在或是否可创建
*/
private function dir_isvalid($dir) {
if (is_dir ( $dir ))
return true;
try {
mkdir ( $dir, 0777 );
} catch ( Exception $e ) {
$this->error ( '所设定缓存目录不存在并且创建失败!请检查目录权限!' );
return false;
}
return true;
}
/**
* 取得当前页面完整url
*/
private function geturl() {
$url = '';
if (isset ( $_SERVER ['REQUEST_URI'] )) {
$url = $_SERVER ['REQUEST_URI'];
} else {
$url = $_SERVER ['Php_SELF'];
$url .= empty ( $_SERVER ['QUERY_STRING'] ) ? '' : '?' . $_SERVER ['QUERY_STRING'];
}
return $url;
}
/**
* 输出错误信息
*/
private function error($str) {
echo '<div style="color:red;">' . $str . '</div>';
}
}
使用方法:
使用方法如下:
一部分代码放在要被缓存逻辑代码前面:
$cachedir = './Cache/'; // 设定缓存目录
$cache = new Cache ( $cachedir, 33 ); // 省略参数即采用缺省设置, $cache = new Cache($cachedir);
if (@$_GET ['cacheact'] != 'rewrite' || @$_GET ['clearCache'] == 'ok') // 此处为一技巧,通过xx.Php?cacheact=rewrite更新缓存,以此类推,还可以设定一些其它操作
$cache->load (); // 装载缓存,缓存有效则不执行以下页面代码
// 页面代码开始
一部分放在被缓存逻辑代码后面:
// 页面代码结束
$cache->write (); // 首次运行或缓存过期,生成缓存
原文地址:http://sijienet.com/bbs/?leibie=showinfo&id=50
php 缓存工具类 实现网页缓存的更多相关文章
- Cache【硬盘缓存工具类(包含内存缓存LruCache和磁盘缓存DiskLruCache)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 内存缓存LruCache和磁盘缓存DiskLruCache的封装类,主要用于图片缓存. 效果图 代码分析 内存缓存LruCache和 ...
- 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Caching; usi ...
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- redis缓存工具类
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis ...
- redis缓存工具类,提供序列化接口
1.序列化工具类 package com.qicheshetuan.backend.util; import java.io.ByteArrayInputStream; import java.io. ...
- SpringBoot整合Redis、mybatis实战,封装RedisUtils工具类,redis缓存mybatis数据 附源码
创建SpringBoot项目 在线创建方式 网址:https://start.spring.io/ 然后创建Controller.Mapper.Service包 SpringBoot整合Redis 引 ...
- CookieUtils-浏览器缓存工具类
package cn.yonyong.myproject.commons.utils; import javax.servlet.http.Cookie; import javax.servlet.h ...
- 缓存工具类CacheHelper
代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- 基于spring的redisTemplate的缓存工具类
pom.xml文件添加 <!-- config redis data and client jar --><dependency> <groupId>org.spr ...
随机推荐
- Windows命令行bat批处理延迟sleep方法
使用ping 的定时功能,精度1秒 实战:创建示例文件test.bat,内容如下: 代码如下:ping -n 3 127.0.0.1>nul 说明:3为ping包发送次数,可作为延迟秒数进行使用 ...
- 【BZOJ 3223】 文艺平衡树
[题目链接] 点击打开链接 [算法] 本题是splay区间操作的模板题 我们每个点的权值设为”当前在序列中的排名“,根据二叉排序树的性质,这棵树的中序遍历就是当前序列 如果我们要获得一段区间[l,r] ...
- 尚观Linux最佳入门高清视频教程033/133/253
[高清]Linux 最佳入门ULE112- RHCE033部分高清视频教程[尚观原创] 视频简介:高清RHCE033部分是RHCE考试中的基础部分,同时也是我们Linux入门的必 备学习资料.想学好L ...
- 【Cocos2d-HTML5 开发之一】新建HTML5项目及简单阐述与cocos2d/x引擎关系
真的是有一段时间没写博了,这段时间呢,发生的事情真的挺多,另外自己呢也闲来做了一些自己的喜欢的东西,主要做的还是基于Mac系统的Cocoa框架的各种编辑器吧.(对了,今年初也出了自己第二本书<i ...
- css3 实现png图片改变背景颜色
实际上是用的是就是css的filter的drop-shadow属性 drop-shadow: 1 不支持内阴影 2 不支持多阴影 3 兼容性 ie13+ 谷歌 火狐 android4.4+ i ...
- pymssql读取varchar字段中文显示乱码的问题分析
问题 用python的pymssql模块读取旧业务系统后台SQL Server 2000数据库展示数据为乱码 开发环境 操作系统:windows 8 数据库 MS SQL Server 2000,默认 ...
- 容器vector 迭代器iterator 应用
#include <iostream> #include <vector> using namespace std; int main() { vector<int> ...
- 【215】◀▶ IDL 文件操作说明 (黑底)
参考:I/O - General File Access Routines —— 基本文件操作函数 01 CD 修改当前的工作空间路径. 02 FILE_SEARCH 对文件名进行特定的查找. ...
- Linux常用的18个命令(复习)
1. cd命令 它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径.如: cd /root/Docements # 切换到目录/root/Docements cd . ...
- (12)用css设计电子相册 {下}
本篇学习资料讲解: 延续上一篇的学习资料,仍然介绍 使用css对电子相册进行排版 和 侧面强调“盒子模型.标准流.浮动和定位”的重要性. 上篇学习资料介绍的“阵列模式电子相册”,如果也能 ...