cache緩存


緩存分為:數據緩存,頁面緩存,內存緩存(memcache,redis)

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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM