文档章节

【PHP】缓存技术!缓存类,看看原理吧

RablePHP
 RablePHP
发布于 2016/08/08 15:39
字数 470
阅读 35
收藏 1
点赞 0
评论 0
<?php

	

	/**
	* 	缓存
	*/
	class Cache
	{

		private $cachedir	=	'./cache/'; //目录
		private $cachetime  =	0;			//更新时间
		private $cachename	=	"";			//文件名称
		private $cachefile	=	".php";		//文件后缀名
		


		function __construct($cachetime)
		{
			if(intval($cachetime)){
				$this->cachetime =$cachetime;
				$this->cachename=$this->getFileName();
				ob_start();
			}
		}

		/**
		 * [cacheCheck 检测缓存是否过期]
		 * @return [type] [description]
		 */
		public function cacheCheck($name=''){
			$name=$this->pathSet($name);
			if(file_exists($name))
			{
				$ctime=$this->createCacheTime($name);
				if ($ctime+$this->cachetime>time()) {
					echo "【以下为缓存】";
					echo file_get_contents($name);
					ob_end_flush();

					exit();
				}
			}
			elseif(file_exists($this->cachename))
			{
				$ctime=$this->createCacheTime($this->cachename);
				if ($ctime+$this->cachetime>time()) {
					echo "【以下为缓存】";
					echo file_get_contents($this->cachename);
					ob_end_flush();

					exit();
				}
			}
			return false;
		}
		/**
		 * [pathSet 名称格式化]
		 * @param  [type] $name [description]
		 * @return [type]       [description]
		 */
		public function pathSet($name){
			return "./".$name;
		}
		/**
		 * [putCache 写出缓存]
		 * @param  string $name [description]
		 * @return [type]       [description]
		 */
		public function putCache($name=''){
			if ($this->cachename) {

				$content =	ob_get_contents(); //获取当前页面的所有内容

				ob_end_flush();

				if ($name) {
					$this->saveCache($name,$content);
				}

				elseif($this->cachetime){
					$this->saveCache($this->cachename,$content);
				}
			}
		}
		/**
		 * [saveCache 保存缓存]
		 * @param  [type] $name    [description]
		 * @param  [type] $content [description]
		 * @return [type]          [description]
		 */
		public function saveCache($name,$content){
			if (!$name || !$content) return false;

			if ($this->makeDir(dirname($name))) {
				if ($fp=fopen($name,"w")) {
					if (@fwrite($fp,$content)) {
						fclose($fp);
						return true;
					}else{
						fclose($fp);
						return false;
					}
				}
			}

			return false;
		}
		/**
		 * [clearCache 清除缓存]
		 * @param  string $fileName [description]
		 * @return [type]           [description]
		 */
		public function clearCache($fileName = "all") {  
			if($fileName !="all"){
				$fileName = $this->cachedir.strtoupper(md5($fileName)).$this->cachefile;

				if (file_exists($fileName)) {
					return @unlink($fileName);
				}else{
					return false;
				}
			}

			if(is_dir($this->cachedir)){
				if ($dir = @opendir($this->cachedir)) {
					while ($file = @readdir($dir)) {
						$check = is_dir($file);
						if (!$check) {
							@unlink($this->cachedir.$file);
						}
					}

					@closedir($dir);
					return true;
				}else{
					return false;
				}
			}else{
				return false;
			}
		} 
		/**
		 * [makeDir 创建文件]
		 * @param  [type] $dirname [description]
		 * @return [type]          [description]
		 */
		public function makeDir($dir,$mode='0777'){
			if (!$dir){return 0;}

			$dir = str_replace("\\","/",$dir);
			$mdir = "";

			foreach (explode("/",$dir) as $val) {
				$mdir .=$val."/";
				if ($val == ".." || $val == "." || trim($val)== "")continue;

				if (!file_exists($mdir)) 
				{
					if (!@mkdir($mdir,$mode)) 
					{
						return false;
					}
				}	
			}
			return true;
		}

		/**
		 * [createCacheTime 创建缓存时间名]
		 * @param  [type] $cachename [description]
		 * @return [type]            [description]
		 */
		public function createCacheTime($cachename){
			if(!trim($cachename))return 0;
			if(file_exists($cachename)){
				return intval(filemtime($cachename));
			}else{
				return 0;
			}
		}
	   /**
		* [getFileName 生成一个缓存文件名]
		* @return [type] [description]
		*/
		public function getFileName(){
			return $this->cachedir.strtoupper(md5($_SERVER['REQUEST_URI'])).$this->cachefile;
		}

	}

index.php

<?php

	include $_SERVER['DOCUMENT_ROOT']."/slike/cache.php";

   	$cache=new Cache(30);
   	//$cache->clearCache();

	if(!$cache->cacheCheck('111.php')){
	   	echo file_get_contents($_SERVER['DOCUMENT_ROOT']."/slike/view/index.html");  
		echo date("Y-m-d H:i:s");
		$cache->putCache('111.php'); 
	}


 






© 著作权归作者所有

共有 人打赏支持
RablePHP
粉丝 15
博文 47
码字总数 11895
作品 0
巴南
程序员
让人疑惑的Java代码,竟成大多公司面试题热门

小编今天给大家看的这个笔试题 当年可是火遍大江南北 不妨你先看看到底会不会 这是关于一段令人疑惑的Java代码 下面我们来看一下Java代码 执行一下:会是什么呢 一个是true,一个是false,这...

OSC_Lucy ⋅ 2017/07/11 ⋅ 16

秋色园QBlog技术原理解析:性能优化篇:字节、缓存、并发(十二)

文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色园QBl...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

秋色园QBlog技术原理解析:性能优化篇:缓存总有失效时,持续的缓存方案(十四)

文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色园QBl...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

Web APi之控制器创建过程及原理解析(八)

前言 中秋歇了歇,途中也时不时去看看有关创建控制器的原理以及解析,时间拖得比较长,实在是有点心有余而力不足,但又想着既然诺下了要写完原理一系列,还需有始有终。废话少说,直入主题。...

jeffcky ⋅ 2015/09/28 ⋅ 0

秋色园QBlog技术原理解析:性能优化篇:读写分离与文本数据库(十八)

上节回顾: 上节 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七) , 秋色园 QBlog 对于频繁产生更新操作的访问计数器(用户表及文章表),进行了另一种优化方案处理,使得...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

秋色园QBlog技术原理解析:性能优化篇:打印页面SQL,全局的SQL语句优化(十三)

文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色园QBl...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)

文章回顾: PS:秋色园QBlog下载地址:http://www.cyqdata.com/download/article-detail-427 上节回顾: 上节 秋色园QBlog技术原理解析:性能优化篇:缓存总有失效时,构造持续的缓存方案(十...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六) 中, 介绍了 Access的并发上限,及从某种程度上 秋色园QBlog 针对并发上限进行了多个数据...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

秋色园QBlog技术原理解析:Module之页面基类-生命周期流程(六)

文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色园QBl...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

深入分析Volatile的实现原理

术语 英文单词 描述 共享变量 在多个线程之间能够被共享的变量被称为共享变量。共享变量包括所有的实例变量,静态变量和数组元素。他们都被存放在堆内存中,Volatile只作用于共享变量。 内存...

markGao ⋅ 2014/04/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

磁盘管理—逻辑卷lvm

4.10-4.12 lvm 操作流程: 磁盘分区-->创建物理卷-->划分为卷组-->划分成逻辑卷-->格式化、挂载-->扩容。 磁盘分区 注: 创建分区时需要更改其文件类型为lvm(代码8e) 分区 3 已设置为 Linu...

弓正 ⋅ 4分钟前 ⋅ 0

Spring源码解析(六)——实例创建(上)

前言 经过前期所有的准备工作,Spring已经获取到需要创建实例的 beanName 和对应创建所需要信息 BeanDefinition,接下来就是实例创建的过程,由于该过程涉及到大量源码,所以将分为多个章节进...

MarvelCode ⋅ 24分钟前 ⋅ 0

a href="#"

<a href="#">是链接到本页,因为你有的时候需要有个链接的样式,但是又不希望他跳转,这样写,你可以把这个页面去试试

颖伙虫 ⋅ 31分钟前 ⋅ 0

js模拟栈和队列

栈和队列 栈:LIFO(先进后出)一种数据结构 队列:LILO(先进先出)一种数据结构 使用的js方法 1.push();可以接收任意数量的参数,把它们逐个推进队尾(数组末尾),并返回修改后的数组长度。 2....

LIAOJIN1 ⋅ 31分钟前 ⋅ 0

180619-Yaml文件语法及读写小结

Yaml文件小结 Yaml文件有自己独立的语法,常用作配置文件使用,相比较于xml和json而言,减少很多不必要的标签或者括号,阅读也更加清晰简单;本篇主要介绍下YAML文件的基本语法,以及如何在J...

小灰灰Blog ⋅ 40分钟前 ⋅ 0

IEC60870-5-104规约传送原因

1:周期循环2:背景扫描3:自发4:初始化5:请求6:激活7:激活确认8:停止激活9:停止激活确认10:激活结束11:远程命令引起的返送信息12:当地命令引起的返送信息13:文件传送20:响应总召...

始终初心 ⋅ 53分钟前 ⋅ 0

【图文经典版】冒泡排序

1、可视化排序过程 对{ 6, 5, 3, 1, 8, 7, 2, 4 }进行冒泡排序的可视化动态过程如下 2、代码实现    public void contextLoads() {// 冒泡排序int[] a = { 6, 5, 3, 1, 8, 7, 2, ...

pocher ⋅ 今天 ⋅ 0

ORA-12537 TNS-12560 TNS-00530 ora-609解决

oracle 11g不能连接,卡住,ORA-12537 TNS-12560 TNS-00530 TNS-12502 tns-12505 ora-609 Windows Error: 54: Unknown error 解决方案。 今天折腾了一下午,为了查这个问题。。找了N多方案,...

lanybass ⋅ 今天 ⋅ 0

IDEA反向映射Mybatis

1.首先在pom文件的plugins中添加maven对mybatis-generator插件的支持 ` <!-- mybatis逆向工程 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-ma......

lichengyou20 ⋅ 今天 ⋅ 0

4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例

准备磁盘分区 fdisk /dev/sdb n 创建三个新分区,分别1G t 改变分区类型为8e 准备物理卷 pvcreate /dev/sdb1 pvcreate /dev/sdb2 pvcreate /dev/sdb3 pvdisplay/pvs 列出当前的物理卷 pvremo...

Linux_老吴 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部