緩存分為:數據緩存,頁面緩存,內存緩存(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>
