cache缓存

ob,输出缓冲区,是output buffering的简称

FileCache.php

 1 <?php
 2 //本文件用来存储和读取文件中的数据
 3 class FileCache{
 4     //使用单例(一个静态变量->保存对象;一个静态方法->判断是否属于自身)
 5     private static $config;//用来存储配置信息
 6     private static $obj;
 7     private function __construct() {//禁止外部实例化对象
 8         self::$config=  include ‘filecache_config.php‘;
 9     }
10     private function __clone() {//禁止外部复制对象
11
12     }
13     public static function getinstance(){  //静态方法
14         if(!(self::$obj instanceof self)){
15             self::$obj=new self;
16         }
17         return self::$obj;
18     }
19     //存储文件缓存,设置两个值  文件名和数据
20     public function setcache($key,$data){
21         $path=self::$config[‘cache_path‘].$key.‘.php‘;
22         $str=var_export($data,TRUE);//var_export()把数组转换成数组格式的字符串。
23         $content="<?php\r\nreturn ".$str.";\r\n?>";//   \r是回车,使光标回到行首;\n是换行,使光标移动到下一行
24         file_put_contents($path,$content);//存储文件(路径,内容)
25     }
26     //获取缓存文件
27     public function getcache($key){
28         $path=self::$config[‘cache_path‘].$key.‘.php‘;
29         if(!file_exists($path)){//判断文件是否存在
30             return FALSE;
31         }
32         if((time()-filemtime($path))>self::$config[‘cache_time‘]){//判断时间是否超时,filemtime()取得文件的修改时间
33             unlink($path);//删除文件用unlink
34             return FALSE;
35         }
36         $data=include $path;
37         return $data;
38     }
39 }
40 //$obj= FileCache::getinstance();
41 ////$obj->setcache(1,[‘aa‘=>5]);
42 //$content=$obj->getcache(1);
43 //var_dump($content);

filecache_config.php

1 <?php
2 return array(
3     ‘cache_path‘=>‘cache/‘,// 设置缓存存储目录,cache文件夹
4     ‘cache_time‘=>60       // 设置缓存保存时间60秒
5 );

fruitclass.php

 1 <?php
 2
 3 class Fruit{
 4     private $db;//成员变量
 5     private $cache;
 6     public function __construct() {
 7         include ‘../single/db_mysql single.php‘;
 8         include ‘../Cache/FileCache.php‘;
 9         $this->db= db_mysql::getinstance();//打开了数据库连接。
10         $this->cache=  FileCache::getinstance();
11     }
12     public function listdata(){
13         $key=md5($_SERVER[‘REQUEST_URI‘]);
14         $data=$this->cache->getcache($key);//获取缓存
15         if(!$data){//判断缓存文件是否存在(时间是否超时),如果不存在,要去数据库中查询数据
16             $data=$this->db->getlist("*","fruit",array("fruit_name"=>‘苹果‘));//调用getlist方法。从数据库查询
17             $this->cache->setcache($key,$data);//存储缓存
18         }
19         return $data;
20     }
21 }
22 $fruit=new Fruit();
23 echo "<pre>";
24 var_dump($fruit->listdata());

上边输出的结果为:(即获取到的缓存)

 1 <?php
 2 return array (
 3   0 =>
 4   array (
 5     ‘id‘ => ‘118‘,
 6     ‘supplier_id‘ => ‘2‘,
 7     ‘fruit_name‘ => ‘苹果‘,
 8     ‘price‘ => ‘2.00‘,
 9   ),
10   1 =>
11   array (
12     ‘id‘ => ‘114‘,
13     ‘supplier_id‘ => ‘1‘,
14     ‘fruit_name‘ => ‘苹果‘,
15     ‘price‘ => ‘3.00‘,
16   ),
17   2 =>
18   array (
19     ‘id‘ => ‘117‘,
20     ‘supplier_id‘ => ‘2‘,
21     ‘fruit_name‘ => ‘苹果‘,
22     ‘price‘ => ‘3.00‘,
23   ),
24 );
25 ?>

db_mysql single.php

 1 <?php
 2 class db_mysql{// 单例中包含三个私有属性(一个静态变量,一个构造函数,一个克隆方法),一个公共静态方法。三私一公
 3     private static $instance;// 用来存储数据库连接
 4     private $pdo;
 5     private function __construct(){// 私有构造函数,定义成private型,防止外部实例化对象
 6         //echo 11;
 7         $this->con("my_blog","root","123456");//连接数据库
 8     }
 9     private function __clone(){
10 //定义成私有的是防止对象被克隆,克隆是可以改变参数。如果$db4=$db;这是赋值操作,不能改变参数
11         echo 22;
12     }
13     private function con($dbname,$username,$password){//数据库连接,三种方式:mysql_connet   mysqli   pdo
14         try {
15             $this->pdo=new PDO("mysql:host=localhost;dbname=$dbname",$username,$password);// 创建pdo连接对象
16             echo "连接成功";
17         } catch (PDOException $ex) {
18             echo $ex->getMessage();
19         }
20     }
21     public static function getinstance(){
22         if(!(self::$instance instanceof self)){// self代表自身(本身是一个对象),判断$instance的值属不属于这个对象,
23             self::$instance=new self;// self代表  db_mysql
24         }
25         return self::$instance;
26     }
27     public function insert($data){// 添加功能
28         if(!is_array($data)){
29             return FALSE;
30         }
31         $fields=  array_keys($data);
32         $val=array_values($data);
33 //        var_dump($val);//数组
34         $str=array_walk($val,array($this,‘parsestr‘));// 通过循环方式,循环数组中的每一个值
35         //foreach($val as $k=>$v){$val[$k]=parsestr($v)};
36         //array_walk    相当于一个while循环,array($this,‘‘)是一个数组,parsestr是一个回调函数
37 //        echo "<pre>";
38 //        var_dump($val);//数组
39         $str=implode(",", $val);
40 //         echo "<br>";
41 //          echo "<pre>";
42 //        echo $str;
43         $fields=  implode(",", $fields);
44         $sql="insert into fruit ($fields) values ($str) ";
45         echo $sql;
46         echo "<br>";
47         $num=$this->pdo->exec($sql);
48         echo $num;
49         echo "<br>";
50         $id=  $this->pdo->lastInsertId();
51         echo $id;
52     }
53     public function getlist($fileds,$table,$condition){//$fileds  字段  $table表名   $condition 查询条件
54         if(!is_array($condition)){
55             return FALSE;
56         }
57         $where="1=1";
58         foreach ($condition as $key => $val){
59             $where .=" and $key =‘".$val."‘";
60         }
61         $sql="select ".$fileds." from ".$table." where ".$where;
62         $result=$this->pdo->query($sql);
63         if($result){//判断$result,是否有值
64            return  $result->fetchall(PDO::FETCH_ASSOC);
65         }
66     }
67
68     public function parsestr(&$val){//引用
69          $val= "‘".$val."‘";// $val[$k]=
70 //         echo "<pre>";
71 //         echo $val;//字符串
72     }
73
74 }
75 //$b=new db_mysql();
76 $db=  db_mysql::getinstance();
77 echo "<br>";
78 //$db2=  db_mysql::getinstance();
79 echo "<br>";
80 //$db3= clone $db;//克隆
81 $db->insert([‘fruit_name‘=>‘葡萄‘,‘supplier_id‘=>2]);
82 echo "<br>";
83 $a=$db->getlist("*",‘fruit‘,array(‘fruit_name‘=>‘苹果‘));
84 echo "<br>";
85 echo "<pre>";
86 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输出的内容先存到缓冲区,再通过服务器发送到浏览器。

 1 if(!file_exists(‘aa.html‘)){
 2     //phpcms中的生成首页就是这个功能
 3     echo 11;
 4     $username = ‘张三‘;
 5     ob_start(); //打开缓冲区(内存)
 6     include ‘../d/d2-4form/form.html‘; //加载动态页面,在内存中(缓冲区),(要把这个页面从内存中取出,保存下来)
 7     $str = ob_get_contents(); //获取缓冲区中的内容,并且以字符串格式返回
 8     file_put_contents(‘aa.html‘, $str); //保存内容
 9     ob_end_flush();//关闭缓冲区,把PHP缓冲区的内容发送给服务器,并清除PHP缓冲区中的内容
10 //    ob_end_clean(); //直接清空PHP缓冲区的内容,并且关闭缓冲区
11 }else{
12     include ‘aa.html‘;//下次读取的时候直接读取静态页面
13 }

aa.html

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <title>表单 demo</title>
 5         <meta charset="UTF-8">
 6         <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7     </head>
 8     <body>
 9         <div>
10             <form action="get_form.php" method="post">
11                 <p>
12                     用户:<input type="text" name="user" size="30" maxlength="2" value="张三" >
13                 </p>
14                 <P>
15                     文件:<input type="file" name="file">
16                 </P>
17                 <button>登录</button>
18             </form>
19         </div>
20     </body>
21 </html>

form.html

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <title>表单 demo</title>
 5         <meta charset="UTF-8">
 6         <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7     </head>
 8     <body>
 9         <div>
10             <form action="get_form.php" method="post">
11                 <p>
12                     用户:<input type="text" name="user" size="30" maxlength="2" value="<?php echo $username; ?>" >
13                 </p>
14                 <P>
15                     文件:<input type="file" name="file">
16                 </P>
17                 <button>登录</button>
18             </form>
19         </div>
20     </body>
21 </html>
时间: 2024-10-28 13:30:14

cache缓存的相关文章

注释驱动的 Spring cache 缓存介绍--转载

概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果. Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存

Android 获取cache缓存的目录路径

转发请备注原文地址:https://www.niwoxuexi.com/blog/android00/article/224.html Android开发中,有时需要知道cache缓存的路径.我写了一个静态类,供大家能参考 public class  CommonUtil {        /**     * 获取cache路径     *     * @param context     * @return     */    public static String getDiskCache

注释驱动的 Spring cache 缓存介绍

概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果. Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存

[转]注释驱动的 Spring cache 缓存介绍

原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果. Spring 的缓存技术还具备相当的灵活性,不仅能

spring boot guava cache 缓存学习

http://blog.csdn.net/hy245120020/article/details/78065676 ************************************************************ spring boot guava cache 缓存学习 自定义key 自定义全局key过期时间,缓存个数 针对单个key自定义过期时间,缓存个数 引入依赖 <dependency> <groupId>org.springframework.boo

Linux cache 缓存过大

linux cache 缓存过大 : 除重启服务 之外:直接释放内存方式之一: 修改配置释放cached内存: echo 1 > /proc/sys/vm/drop_caches 原文地址:https://www.cnblogs.com/sharesdk/p/9203903.html

System.Web.Cache缓存的封装和调用示例

目录 HttpCache类 Objects类 调用示例 HttpCache类 /// <summary> /// System.Web.Cache缓存的封装 /// </summary> public static class HttpCache { /// <summary> /// 当前应用程序的的缓存实例 /// </summary> public static System.Web.Caching.Cache Current { get { retu

cache缓存与伪共享

一.cache缓存 cache与主存之间是以块为单位读写的,这样设计是为了符合程序运行的局部性原理--时间局部性原理与空间局部性原理(参见<计算机组成原理>) 二维数组行遍历比列遍历要快,是由于二维数组是按行存储的,cache从主存中读入块,会将同行相邻元素一起写入cache,导致行遍历cache命中率大于列遍历cache命中率. public class CacheTest { static final int LINE_NUM = 1024; static final int COLUMN

django cache 缓存系统

django 缓存系统 https://docs.djangoproject.com/en/dev/topics/cache/#the-low-level-cache-api http://www.ziqiangxuetang.com/django/django-cache.html 可以缓存能被pickle的对象 安装 pip install hiredis django-redis-cache setting中配置 #KEY_PREFIX  设置缓存键值的前缀 CACHES = { 'mys