cache缓存
Posted 李昊宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>
以上是关于cache缓存的主要内容,如果未能解决你的问题,请参考以下文章