cache缓存
缓存分为:数据缓存,页面缓存,内存缓存(memcache,redis)
ob,输出缓冲区,是output buffering的简称
FileCache.php
<?php
//本文件用来存储和读取文件中的数据
class FileCache{
//使用单例(一个静态变量->保存对象;一个静态方法->判断是否属于自身)
private static $config;//用来存储配置信息
private static $obj;
private function __construct() {//禁止外部实例化对象
self::$config= include 'filecache_config.php';
}
private function __clone() {//禁止外部复制对象 }
public static function getinstance(){ //静态方法
if(!(self::$obj instanceof self)){
self::$obj=new self;
}
return self::$obj;
}
//存储文件缓存,设置两个值 文件名和数据
public function setcache($key,$data){
$path=self::$config['cache_path'].$key.'.php';
$str=var_export($data,TRUE);//var_export()把数组转换成数组格式的字符串。
$content="<?php\r\nreturn ".$str.";\r\n?>";// \r是回车,使光标回到行首;\n是换行,使光标移动到下一行
file_put_contents($path,$content);//存储文件(路径,内容)
}
//获取缓存文件
public function getcache($key){
$path=self::$config['cache_path'].$key.'.php';
if(!file_exists($path)){//判断文件是否存在
return FALSE;
}
if((time()-filemtime($path))>self::$config['cache_time']){//判断时间是否超时,filemtime()取得文件的修改时间
unlink($path);//删除文件用unlink
return FALSE;
}
$data=include $path;
return $data;
}
}
//$obj= FileCache::getinstance();
////$obj->setcache(1,['aa'=>5]);
//$content=$obj->getcache(1);
//var_dump($content);
filecache_config.php
<?php
return array(
'cache_path'=>'cache/',// 设置缓存存储目录,cache文件夹
'cache_time'=>60 // 设置缓存保存时间60秒
);
fruitclass.php
<?php
class Fruit{
private $db;//成员变量
private $cache;
public function __construct() {
include '../single/db_mysql single.php';
include '../Cache/FileCache.php';
$this->db= db_mysql::getinstance();//打开了数据库连接。
$this->cache= FileCache::getinstance();
}
public function listdata(){
$key=md5($_SERVER['REQUEST_URI']);
$data=$this->cache->getcache($key);//获取缓存
if(!$data){//判断缓存文件是否存在(时间是否超时),如果不存在,要去数据库中查询数据
$data=$this->db->getlist("*","fruit",array("fruit_name"=>'苹果'));//调用getlist方法。从数据库查询
$this->cache->setcache($key,$data);//存储缓存
}
return $data;
}
}
$fruit=new Fruit();
echo "<pre>";
var_dump($fruit->listdata());
上边输出的结果为:(即获取到的缓存)
<?php
return array (
0 =>
array (
'id' => '118',
'supplier_id' => '2',
'fruit_name' => '苹果',
'price' => '2.00',
),
1 =>
array (
'id' => '114',
'supplier_id' => '1',
'fruit_name' => '苹果',
'price' => '3.00',
),
2 =>
array (
'id' => '117',
'supplier_id' => '2',
'fruit_name' => '苹果',
'price' => '3.00',
),
);
?>
db_mysql single.php
<?php
class db_mysql{// 单例中包含三个私有属性(一个静态变量,一个构造函数,一个克隆方法),一个公共静态方法。三私一公
private static $instance;// 用来存储数据库连接
private $pdo;
private function __construct(){// 私有构造函数,定义成private型,防止外部实例化对象
//echo 11;
$this->con("my_blog","root","123456");//连接数据库
}
private function __clone(){
//定义成私有的是防止对象被克隆,克隆是可以改变参数。如果$db4=$db;这是赋值操作,不能改变参数
echo 22;
}
private function con($dbname,$username,$password){//数据库连接,三种方式:mysql_connet mysqli pdo
try {
$this->pdo=new PDO("mysql:host=localhost;dbname=$dbname",$username,$password);// 创建pdo连接对象
echo "连接成功";
} catch (PDOException $ex) {
echo $ex->getMessage();
}
}
public static function getinstance(){
if(!(self::$instance instanceof self)){// self代表自身(本身是一个对象),判断$instance的值属不属于这个对象,
self::$instance=new self;// self代表 db_mysql
}
return self::$instance;
}
public function insert($data){// 添加功能
if(!is_array($data)){
return FALSE;
}
$fields= array_keys($data);
$val=array_values($data);
// var_dump($val);//数组
$str=array_walk($val,array($this,'parsestr'));// 通过循环方式,循环数组中的每一个值
//foreach($val as $k=>$v){$val[$k]=parsestr($v)};
//array_walk 相当于一个while循环,array($this,'')是一个数组,parsestr是一个回调函数
// echo "<pre>";
// var_dump($val);//数组
$str=implode(",", $val);
// echo "<br>";
// echo "<pre>";
// echo $str;
$fields= implode(",", $fields);
$sql="insert into fruit ($fields) values ($str) ";
echo $sql;
echo "<br>";
$num=$this->pdo->exec($sql);
echo $num;
echo "<br>";
$id= $this->pdo->lastInsertId();
echo $id;
}
public function getlist($fileds,$table,$condition){//$fileds 字段 $table表名 $condition 查询条件
if(!is_array($condition)){
return FALSE;
}
$where="1=1";
foreach ($condition as $key => $val){
$where .=" and $key ='".$val."'";
}
$sql="select ".$fileds." from ".$table." where ".$where;
$result=$this->pdo->query($sql);
if($result){//判断$result,是否有值
return $result->fetchall(PDO::FETCH_ASSOC);
}
} public function parsestr(&$val){//引用
$val= "'".$val."'";// $val[$k]=
// echo "<pre>";
// echo $val;//字符串
} }
//$b=new db_mysql();
$db= db_mysql::getinstance();
echo "<br>";
//$db2= db_mysql::getinstance();
echo "<br>";
//$db3= clone $db;//克隆
$db->insert(['fruit_name'=>'葡萄','supplier_id'=>2]);
echo "<br>";
$a=$db->getlist("*",'fruit',array('fruit_name'=>'苹果'));
echo "<br>";
echo "<pre>";
var_dump($a);
缓冲区的概念:(可用于页面缓存,即每次访问页面时,就检测相应的页面缓存是否存在,若不存在,则查询数据库得到相应的数据,同时生成缓存页面,这样,在下次访问时就可以直接取出缓存页面,不必再次查询数据库)
PHP文件(输入或输出的内容)->缓冲区(内存)->apache->浏览器
会引起缓冲区刷新的操作有:
1、PHP程序执行完毕。
2、缓冲区的大小超过了php.ini配置文件中设置的output_buffering的值(大小为4kb)。
3、ob_flush() 或 flush() 函数被调用时。
ob_flush();强制刷新缓冲区,把缓冲区的内容发送到Apache服务器。
flush();刷新Apache服务器,把Apache中的内容发送到浏览器,和ob_flush();要同时用。
echo,print_r,var_dump输出的内容先存到缓冲区,再通过服务器发送到浏览器。
if(!file_exists('aa.html')){
//phpcms中的生成首页就是这个功能
echo 11;
$username = '张三';
ob_start(); //打开缓冲区(内存)
include '../d/d2-4form/form.html'; //加载动态页面,在内存中(缓冲区),(要把这个页面从内存中取出,保存下来)
$str = ob_get_contents(); //获取缓冲区中的内容,并且以字符串格式返回
file_put_contents('aa.html', $str); //保存内容
ob_end_flush();//关闭缓冲区,把PHP缓冲区的内容发送给服务器,并清除PHP缓冲区中的内容
// ob_end_clean(); //直接清空PHP缓冲区的内容,并且关闭缓冲区
}else{
include 'aa.html';//下次读取的时候直接读取静态页面
}
aa.html
<!DOCTYPE html>
<html>
<head>
<title>表单 demo</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>
<form action="get_form.php" method="post">
<p>
用户:<input type="text" name="user" size="30" maxlength="2" value="张三" >
</p>
<P>
文件:<input type="file" name="file">
</P>
<button>登录</button>
</form>
</div>
</body>
</html>
form.html
<!DOCTYPE html>
<html>
<head>
<title>表单 demo</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>
<form action="get_form.php" method="post">
<p>
用户:<input type="text" name="user" size="30" maxlength="2" value="<?php echo $username; ?>" >
</p>
<P>
文件:<input type="file" name="file">
</P>
<button>登录</button>
</form>
</div>
</body>
</html>
cache缓存的更多相关文章
- 注释驱动的 Spring cache 缓存介绍
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- Windows Azure Cloud Service (43) 使用Azure In-Role Cache缓存(2)Dedicated Role
<Windows Azure Platform 系列文章目录> Update 2016-01-12 https://azure.microsoft.com/zh-cn/documentat ...
- [转]注释驱动的 Spring cache 缓存介绍
原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ...
- paip.cache 缓存架构以及性能提升总结
paip.cache 缓存架构以及性能提升总结 1 缓存架构以及性能(贯穿读出式(LookThrough) 旁路读出式(LookAside) 写穿式(WriteThrough) 回写式 ...
- Cache缓存对象缓存对象
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DemoCache.aspx ...
- 注释驱动的 Spring cache 缓存介绍--转载
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- MemCache缓存和C#自带的Cache缓存
1.MemCache: //初始化 static SockIOPool _pool; // 创建Memcached private static MemcachedClient Create(stri ...
- google guava cache缓存基本使用讲解
代码地址:https://github.com/vikde/demo-guava-cache 一.简介 guava cache是google guava中的一个内存缓存模块,用于将数据缓存到JVM内存 ...
- Django学习之十二:Cache 缓存组件
目录 Django Cache 缓存组件 缓存逻辑伪代码 配置缓存源 可配置参数说明 01. Django的默认缓存 02. 基于Redis的django-redis 03. 自定义cache 04. ...
- Nginx 负载均衡的Cache缓存批量清理的操作记录
1)nginx.conf配置 [root@inner-lb01 ~]# cat /data/nginx/conf/nginx.conf user www; worker_processes 8; #e ...
随机推荐
- javascript --- 原型初探七日谈(一)
在javascript中,像原型,闭包这样的概念,只要我们能领悟其中的原理,一切都会显得格外清晰与明了. 原型属性(prototype): 下面我们简单定义一个函数 function her(a, b ...
- Objective-C 快速入门--基础(二)
1.什么是继承?OC中的继承有哪些特点? “继承”是面向对象软件技术当中的一个概念.如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类&quo ...
- JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)
import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; ...
- RecyclerView的基本使用
1.布局文件中使用 <android.support.v7.widget.RecyclerView android:id="@+id/recycleview" android ...
- mac PHP配置
apache默认路径配置方法 apache的配置 apache已经自带了,只需如下三个命令就可以了. 开启apache服务 sudo apachectl start 停止apache服务 sudo ...
- 让UILabel的文字顶部对齐
参考资料 http://stackoverflow.com/questions/1054558/how-do-i-vertically-align-text-within-a-uilabel 方法一 ...
- Spring MVC 原理小结
主要由DispatcherServlet.处理器映射.处理器.视图解析器.视图组成 1.DispatcherServlet接收到一个HTTP请求,根据对应配置文件中的处理机映射,找到处理器(Han ...
- 用最简单话概括SSH三框架
Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句. Struts是用来做应用层的,他它负责调用业务逻辑serivce层,所以S ...
- JMS发布/订阅消息传送例子
前言 基于上篇文章"基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送"很容易就可以编写一个发布/订阅消息传送例子,相关环境准备与该篇文章基本类似,主要 ...
- 将dll程序集添加到缓存里
1.点击开始---所有程序---...如下图 并以管理员身份运行. 2.输入命令行 gacutil.exe /i D:\Word\CRS_BPM_Sln\SourceCode\BPM\Referenc ...