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 ...
随机推荐
- ArcGIS中的WKID
提到坐标系统,大家多少能明白一些,但在运用时,有些朋友搞得不是非常清楚,以后专门来总结.在实地生产项目中,使用较多的2000中国大地坐标系(CGCS2000).1980西安坐标系.1954北京坐标系统 ...
- Office 365 – SharePoint 2013 Online 之WebPart开发、部署教程
1.打开Visual Studio,新建一个项目,选择SharePoint空项目,如下图: 2.选择调试站点和沙盒解决方案,如下图: 3.在项目中,添加一个WebPart,如下图: 4.添加完毕的项目 ...
- webbench 压力测试
原文 webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好用,安装使用也特别方便,并且非常小. 主要是 -t 参数用着比较爽,下面参考了张宴 ...
- C语言笔记
.c是C语言源文件,在编写代码的时候创建 .o是目标文件,在编译成功的时候产生 .obj .out是可执行文件,在链接成功的时候产生 工具:clang编译器(Xcode3 gcc Xcode4 LL ...
- 【原】你真的懂iOS的autorelease吗?
或许这个题目起得有点太高调了,不过我只是想纠正一些童鞋对于autorelease的认识,如果能帮到几个人,那这篇文章也就值得了!当然,高手请绕道 本文主要探讨两个方面:(1)autorelease对象 ...
- lambda浅尝
很久没写日志了,今天动动手记录下刚刚弄了一遍的lambda. 配置module下的build.gradle android { ... // 版本有要求 buildToolsVersion " ...
- Mac下载安装Android Studio教程
今天把公司闲置的一台Mac-mini重装了下系统感觉用着速度还不错,平时上班用的机器USB有些问题,所以打算用这台Mac.以往开发用Intellij Idea就够用,但是这次项目引用的jar包太多,遭 ...
- OEM代工厂产品经理个人经历谈
创业不是一件随随便便的事情! 到2007年时,我已经在上海.广州.东莞三地的工厂打工有十来年了.正是这个时间结点,我也即将做父亲了.打了很久的工后,就开始感到疲倦,做来做去,都是给老板做,也就在这时开 ...
- vim添加Vundle插件
1.git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 2.vim /etc/vimrc se ...
- Sqlite学习笔记(四)&&SQLite-WAL原理
Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...