码迷,mamicode.com
首页 > 系统相关 > 详细

cache缓存

时间:2016-12-05 23:25:46      阅读:381      评论:0      收藏:0      [点我收藏+]

标签:set   end   输出   操作   user   发送   etc   添加   保存时间   

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>

 

cache缓存

标签:set   end   输出   操作   user   发送   etc   添加   保存时间   

原文地址:http://www.cnblogs.com/lhy-wb/p/6135621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!