文档章节

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

RablePHP
 RablePHP
发布于 2016/08/08 15:39
字数 470
阅读 35
收藏 1
<?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
4.7K
16
Web APi之控制器创建过程及原理解析(八)

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

jeffcky
2015/09/28
0
0
Smart framework 缓存插件的实现

Smart是一个轻量级的java web框架,里面已经实现了IOC,AOP以及事务管理,同时也实现了MVC模块。本插件是基于Smart的AOP来进行实现的。目标是:在不需要改变当前业务代码的情况下将缓存功能嵌...

Bieber
2013/11/02
0
2
深入分析Volatile的实现原理

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

markGao
2014/04/23
0
0
[.NET领域驱动设计实战系列]专题九:DDD案例:网上书店AOP和站点地图的实现

原文:[.NET领域驱动设计实战系列]专题九:DDD案例:网上书店AOP和站点地图的实现 一、引言   在前面一专题介绍到,要让缓存生效还需要实现对AOP(面向切面编程)的支持。所以本专题将介绍了...

杰克.陈
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

kiss原则

KISS 原则是用户体验的高层境界,简单地理解这句话,就是要把一个产品做得连白痴都会用,因而也被称为“懒人原则”。换句话说来,”简单就是美“。KISS 原则源于 David Mamet(大卫马梅)的电...

NB-One
13分钟前
2
0
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)

应用场景 前两天我们已经介绍了两种Spring Cloud Stream对消息失败的处理策略: 自动重试:对于一些因环境原因(如:网络抖动等不稳定因素)引发的问题可以起到比较好的作用,提高消息处理的...

程序猿DD
18分钟前
0
0
MYSQL事务处理

INNODB 事务里,所有表引擎必须为INNODB,在非实务表上操作,不会警告,不会报错,但没有效果

关元
57分钟前
3
0
cmake 编译脚本

#!/bin/sh test -d build || mkdir -p build cd build cmake .. make

shzwork
今天
2
0
从零开始实现Vue简单的Toast插件

概述: 在前端项目中,有时会需要通知、提示一些信息给用户,尤其是在后台系统中,操作的正确与否,都需要给与用户一些信息。 1. 实例 在Vue组件的methods内,调用如下代码 `this``.$toast({...

前端小攻略
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部