好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php文件缓存类实例整理 - php高级应用

php文件缓存类实例整理

缓存类是我们开发应用中会常用使用到的功能,下面我来给大家整理几个php文件缓存类了,各个文件缓存类写法不同,但在性能上会有区别,有兴趣测试的朋友可测试一下这些缓存类吧.

例1,代码如下:

<?php  $fzz  =  new  fzz_cache;  $fzz ->kk =  $_SERVER ;  //写入缓存   //$fzz->set("kk",$_SERVER,10000); //此方法不与类属性想冲突,可以用任意缓存名;   print_r( $fzz ->kk);   //读取缓存   //print_r($fzz->get("kk"));   //unset($fzz->kk); //删除缓存   //$fzz->_unset("kk");   var_dump(isset( $fzz ->kk));  //判断缓存是否存在   //$fzz->_isset("kk");   //$fzz->clear(); //清理过期缓存   //$fzz->clear_all(); //清理所有缓存文件   class  fzz_cache{    public   $limit_time  = 20000;  //缓存过期时间     public   $cache_dir  =  "data" ;  //缓存文件保存目录       //写入缓存     function  __set( $key  ,  $val ){     $this ->_set( $key  , $val );   }    //第三个参数为过期时间     function  _set( $key  , $val , $limit_time =null){       $limit_time  =  $limit_time  ?  $limit_time  :  $this ->limit_time;     $file  =  $this ->cache_dir. "/" . $key . ".cache" ;     $val  = serialize( $val );    @ file_put_contents ( $file , $val )  or   $this ->error(__line__, "fail to write in file" );    @ chmod ( $file ,0777);    @touch( $file ,time()+ $limit_time )  or   $this ->error(__line__, "fail to change time" );   }        //读取缓存     function  __get( $key ){     return   $this ->_get( $key );   }    function  _get( $key ){     $file  =  $this ->cache_dir. "/" . $key . ".cache" ;     if  (@ filemtime ( $file )>=time()){      return  unserialize( file_get_contents ( $file ));    } else {     @unlink( $file )  or   $this ->error(__line__, "fail to unlink" );      return  false;    }   }        //删除缓存文件     function  __unset( $key ){     return   $this ->_unset( $key );   }    function  _unset( $key ){     if  (@unlink( $this ->cache_dir. "/" . $key . ".cache" )){      return  true;    } else {      return  false;    }   }        //检查缓存是否存在,过期则认为不存在     function  __isset( $key ){     return   $this ->_isset( $key );   }    function  _isset( $key ){     $file  =  $this ->cache_dir. "/" . $key . ".cache" ;     if  (@ filemtime ( $file )>=time()){      return  true;    } else {     @unlink( $file ) ;      return  false;    }   }        //清除过期缓存文件     function  clear(){     $files  = scandir( $this ->cache_dir);     foreach  ( $files   as   $val ){      if  ( filemtime ( $this ->cache_dir. "/" . $val )<time()){      @unlink( $this ->cache_dir. "/" . $val );     }    }   }        //清除所有缓存文件     function  clear_all(){     $files  = scandir( $this ->cache_dir);     foreach  ( $files   as   $val ){     @unlink( $this ->cache_dir. "/" . $val );    }   }      function  error( $msg , $debug  = false) {     $err  =  new  Exception( $msg );     $str  = "<pre>  <span style= 'color:red' >error:</span>  ".print_r($err->getTrace(),1)."   </pre>"; //开源代码phpfensi测试数据      if ( $debug  == true) {      file_put_contents ( date ( 'Y-m-d H_i_s' ). ".log" , $str );      return   $str ;    } else {      die ( $str );    }   }  }  ?> 

例2.从CI社区的stblog和CI的file_helper类中提取出来的php文件缓存类,一个简单的基于文件的key->value缓存类。

这个类可以用来缓存一些基本信息,比如博客的header,footer,sidebar中的一些不经常变化,从数据库中取出的内容,取数据前先判断文件缓存中的内容是否过期,如果没过期取出来,过期了则连接数据库查询,并将结果重新写入文件缓存,更新过期时间。跟memcache使用类似,不过更方便。用在一些小的应用上足够了...代码如下:

<?php  define( 'DIRECTORY_SEPARATOR' , '/' );  define( 'FOPEN_WRITE_CREATE_DESTRUCTIVE' , 'wb' );  define( 'FOPEN_WRITE_CREATE' , 'ab' );  define( 'DIR_WRITE_MODE' , 0777);  class  FileCache {      /**        * 缓存路径        *        * @access private        * @var string        */     private   $_cache_path ;      /**        * 缓存过期时间,单位是秒second        *        * @access private        * @var int        */     private   $_cache_expire ;      /**        * 解析函数,设置缓存过期实践和存储路径        *         * @access public        * @return void        */     public   function  __construct( $expire ,  $cache_path )   {     $this ->_cache_expire =  $expire ;     $this ->_cache_path =  $cache_path ;   }      /**        * 缓存文件名        *         * @access public        * @param  string $key        * @return void        */     private   function  _file( $key )   {     return   $this ->_cache_path . md5( $key );   }      /**        * 设置缓存        *         * @access public        * @param  string $key 缓存的唯一键        * @param  string $data 缓存的内容        * @return bool        */     public   function  set( $key ,  $data )   {     $value  = serialize( $data );         $file  =  $this ->_file( $key );            return   $this ->write_file( $file ,  $value );   }      /**        * 获取缓存        *         * @access public        * @param  string $key 缓存的唯一键        * @return mixed        */     public   function  get( $key )   {     $file  =  $this ->_file( $key );         /** 文件不存在或目录不可写 */      if  (! file_exists ( $file ) || ! $this ->is_really_writable( $file ))    {      return  false;    }         /** 缓存没有过期,仍然可用 */      if  ( time() < ( filemtime ( $file ) +  $this ->_cache_expire) )     {           $data  =  $this ->read_file( $file );           if (FALSE !==  $data )     {       return  unserialize( $data );     }           return  FALSE;    }         /** 缓存过期,删除之 */     @unlink( $file );     return  FALSE;    }         function  read_file( $file )   {     if  ( !  file_exists ( $file ))    {      return  FALSE;    }       if  (function_exists( 'file_get_contents' ))    {      return   file_get_contents ( $file );      }       if  ( !  $fp  = @ fopen ( $file , FOPEN_READ))    {      return  FALSE;    }         flock ( $fp , LOCK_SH); //读取之前加上共享锁        $data  =  '' ;     if  ( filesize ( $file ) > 0)    {      $data  =&  fread ( $fp ,  filesize ( $file ));    }       flock ( $fp , LOCK_UN); //释放锁     fclose( $fp );       return   $data ;   }       function  write_file( $path ,  $data ,  $mode  = FOPEN_WRITE_CREATE_DESTRUCTIVE)   {     if  ( !  $fp  = @ fopen ( $path ,  $mode ))    {      return  FALSE;    }         flock ( $fp , LOCK_EX);    fwrite( $fp ,  $data );     flock ( $fp , LOCK_UN);    fclose( $fp );        return  TRUE;   }    function  is_really_writable( $file ) //兼容各平台判断文件是否有写入权限    {      // If we're on a Unix server with safe_mode off we call is_writable      if  (DIRECTORY_SEPARATOR ==  '/'  AND @ ini_get ( "safe_mode" ) == FALSE)    {      return   is_writable ( $file );    }       // For windows servers and safe_mode "on" installations we'll actually      // write a file then read it.  Bah...      if  ( is_dir ( $file ))    {      $file  = rtrim( $file ,  '/' ). '/' .md5(rand(1,100));        if  (( $fp  = @ fopen ( $file , FOPEN_WRITE_CREATE)) === FALSE)     {       return  FALSE;     }       fclose( $fp );     @ chmod ( $file , DIR_WRITE_MODE);     @unlink( $file );      return  TRUE;    }     elseif  (( $fp  = @ fopen ( $file , FOPEN_WRITE_CREATE)) === FALSE)    { //开源代码phpfensi测试数据       return  FALSE;    }      fclose( $fp );     return  TRUE;   }  }  $cache  =  new  FileCache(30, 'cache/' );  $cache ->set( 'test' , 'this is a test.' );  print  $cache ->get( 'test' );  /* End of file FlieCache.php */   ?> 

例3.自己觉得很好用的php文件缓存,代码如下:

<?php   class  cache  {     private   static   $_instance  = null;         protected   $_options  =  array (           'cache_dir'         =>  "./" ,           'file_name_prefix'  =>  'cache' ,        'mode'             =>  '1' ,  //mode 1 为serialize model 2为保存为可执行文件       );       /**     * 得到本类实例     *      * @return Ambiguous     */     public   static   function  getInstance()   {     if (self:: $_instance  === null)    {     self:: $_instance  =  new  self();    }     return  self:: $_instance ;   }       /**     * 得到缓存信息     *      * @param string $id     * @return boolean|array     */     public   static   function  get( $id )   {     $instance  = self::getInstance();         //缓存文件不存在      if (! $instance ->has( $id ))    {      return  false;    }         $file  =  $instance ->_file( $id );         $data  =  $instance ->_fileGetContents( $file );         if ( $data [ 'expire' ] == 0 || time() <  $data [ 'expire' ])    {      return   $data [ 'contents' ];    }     return  false;   }      /**     * 设置一个缓存     *      * @param string $id   缓存id     * @param array  $data 缓存内容     * @param int    $cacheLife 缓存生命 默认为0无限生命     */     public   static   function  set( $id ,  $data ,  $cacheLife  = 0)   {     $instance  = self::getInstance();         $time  = time();     $cache       =  array ();     $cache [ 'contents' ] =  $data ;     $cache [ 'expire' ]   =  $cacheLife  === 0 ? 0 :  $time  +  $cacheLife ;     $cache [ 'mtime' ]    =  $time ;         $file  =  $instance ->_file( $id );         return   $instance ->_filePutContents( $file ,  $cache );   }         /**        * 清除一条缓存        *         * @param string cache id          * @return void        */        public   static   function   delete ( $id )   {     $instance  = self::getInstance();         if (! $instance ->has( $id ))    {      return  false;    }        $file  =  $instance ->_file( $id );        //删除该缓存         return  unlink( $file );   }      /**     * 判断缓存是否存在     *      * @param string $id cache_id     * @return boolean true 缓存存在 false 缓存不存在     */     public   static   function  has( $id )   {     $instance  = self::getInstance();     $file      =  $instance ->_file( $id );         if (! is_file ( $file ))    {      return  false;    }     return  true;   }      /**     * 通过缓存id得到缓存信息路径     * @param string $id     * @return string 缓存文件路径     */     protected   function  _file( $id )   {     $instance   = self::getInstance();     $fileNmae   =  $instance ->_idToFileName( $id );     return   $instance ->_options[ 'cache_dir' ] .  $fileNmae ;   }       /**     * 通过id得到缓存信息存储文件名     *      * @param  $id     * @return string 缓存文件名     */     protected   function  _idToFileName( $id )   {     $instance   = self::getInstance();     $prefix     =  $instance ->_options[ 'file_name_prefix' ];     return   $prefix  .  '---'  .  $id ;   }      /**     * 通过filename得到缓存id     *      * @param  $id     * @return string 缓存id     */     protected   function  _fileNameToId( $fileName )   {     $instance   = self::getInstance();     $prefix     =  $instance ->_options[ 'file_name_prefix' ];     return  preg_replace( '/^'  .  $prefix  .  '---(.*)$/' ,  '$1' ,  $fileName );   }      /**     * 把数据写入文件     *      * @param string $file 文件名称     * @param array  $contents 数据内容     * @return bool      */     protected   function  _filePutContents( $file ,  $contents )   {     if ( $this ->_options[ 'mode' ] == 1)    {      $contents  = serialize( $contents );    }     else      {      $time  = time();             $contents  =  "<?phpn" .                    " // mktime: " .  $time .  "n" .                    " return " .                   var_export( $contents , true).                    "n?>" ;    }         $result  = false;        $f  = @ fopen ( $file ,  'w' );           if  ( $f ) {              @ flock ( $f , LOCK_EX);               fseek ( $f , 0);              ftruncate( $f , 0);               $tmp  = @fwrite( $f ,  $contents );               if  (!( $tmp  === false)) {                   $result  = true;              }              @fclose( $f );          }    @ chmod ( $file ,0777);     return   $result ;       }      /**     * 从文件得到数据     *      * @param  sring $file     * @return boolean|array     */     protected   function  _fileGetContents( $file )   {     if (! is_file ( $file ))    {      return  false;    }         if ( $this ->_options[ 'mode' ] == 1)    {      $f  = @ fopen ( $file ,  'r' );      @ $data  =  fread ( $f , filesize ( $file ));     @fclose( $f );      return  unserialize( $data );    }     else     {      return   include   $file ;    }   }      /**     * 构造函数     */     protected   function  __construct()   {     }      /**     * 设置缓存路径     *      * @param string $path     * @return self     */     public   static   function  setCacheDir( $path )   {     $instance   = self::getInstance();           if  (! is_dir ( $path )) {               exit ( 'file_cache: '  .  $path . ' 不是一个有效路径 ' );          }           if  (! is_writable ( $path )) {               exit ( 'file_cache: 路径 "' . $path . '" 不可写' );          }                 $path  = rtrim( $path , '/' ) .  '/' ;           $instance ->_options[ 'cache_dir' ] =  $path ;                     return   $instance ;   }      /**     * 设置缓存文件前缀     *      * @param srting $prefix     * @return self     */     public   static   function  setCachePrefix( $prefix )   {     $instance   = self::getInstance();     $instance ->_options[ 'file_name_prefix' ] =  $prefix ;     return   $instance ;   }      /**     * 设置缓存存储类型     *      * @param int $mode     * @return self     */     public   static   function  setCacheMode( $mode  = 1)   {     $instance   = self::getInstance();     if ( $mode  == 1)    {      $instance ->_options[ 'mode' ] = 1;    }     else     {      $instance ->_options[ 'mode' ] = 2;    }         return   $instance ;   }      /**     * 删除所有缓存     * @return boolean     */     public   static   function   flush ()   {     $instance   = self::getInstance();     $glob  = @ glob ( $instance ->_options[ 'cache_dir' ] .  $instance ->_options[ 'file_name_prefix' ] .  '--*' );         if ( empty empty ( $glob ))    {      return  false;    }         foreach  ( $glob   as   $v )    {      $fileName  =  basename ( $v );      $id  =   $instance ->_fileNameToId( $fileName );      $instance -> delete ( $id );    }     return  true;   }  }    /* 初始化设置cache的配置信息什么的 */   cache::setCachePrefix( 'core' );  //设置缓存文件前缀   cache::setCacheDir( './cache' );  //设置存放缓存文件夹路径     //模式1 缓存存储方式   //a:3:{s:8:"contents";a:7:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:34;i:4;i:5;i:5;i:6;i:6;i:6;}s:6:"expire";i:0;s:5:"mtime";i:1318218422;}   //模式2 缓存存储方式   /*    <?php    // mktime: 1318224645    return array (     'contents' =>      array (       0 => 1,       1 => 2,       2 => 3,       3 => 34,       4 => 5,       5 => 6,       6 => 6,     ),     'expire' => 0,     'mtime' => 1318224645,   )   ?>    *     *     */   cache::setCacheMode( '2' );    if (! $row  = cache::get( 'zj2' ))  {      $array  =  array (1,2,3,34,5,6,6);    $row  = cache::set( 'zj2' , $array );  }  // cache::flush(); 清空所有缓存     print_r( $row );    件缓存  class         <?php  /**    * 文件缓存类    * @author  xiaojiong & 290747680@qq测试数据    * @date 2011-08-17    */   class  cache  {    const  FILE_LIFE_KEY =  'FILE_LIFE_KEY' ;      const  CLEAR_ALL_KEY =  'CLEAR_ALL' ;         static   $_instance  = null;         protected   $_options  =  array (           'cache_dir'  =>  './cache' ,           'file_locking'  => true,           'file_name_prefix'  =>  'cache' ,           'cache_file_umask'  => 0777,        'file_life'   => 100000      );             static   function  &getInstance( $options  =  array ())      {        if (self:: $_instance  === null)       {        self:: $_instance  =  new  self( $options );       }         return  self:: $_instance ;      }             /**        * 设置参数        * @param  array $options 缓存参数        * @return void        */     static   function  &setOptions( $options  =  array ())   {            return  self::getInstance( $options );   }         /**        * 构造函数        * @param  array $options 缓存参数        * @return void        */        private   function  __construct( $options  =  array ())      {             if  ( $this ->_options[ 'cache_dir' ] !== null) {           $dir  = rtrim( $this ->_options[ 'cache_dir' ], '/' ) .  '/' ;            $this ->_options[ 'cache_dir' ] =  $dir ;                 if  (! is_dir ( $this ->_options[ 'cache_dir' ])) {                mkdir ( $this ->_options[ 'cache_dir' ],0777,TRUE);           }            if  (! is_writable ( $this ->_options[ 'cache_dir' ])) {                exit ( 'file_cache: 路径 "' .  $this ->_options[ 'cache_dir' ] . '" 不可写' );           }                  }  else  {              exit ( 'file_cache: "options" cache_dir 不能为空 ' );          }      }         /**        * 设置缓存路径        * @param  string  $value        * @return void        */        static   function  setCacheDir( $value )      {        $self  = & self::getInstance();                  if  (! is_dir ( $value )) {               exit ( 'file_cache: '  .  $value . ' 不是一个有效路径 ' );          }           if  (! is_writable ( $value )) {               exit ( 'file_cache: 路径 "' . $value . '" 不可写' );          }                 $value  = rtrim( $this ->_options[ 'cache_dir' ], '/' ) .  '/' ;                     $self ->_options[ 'cache_dir' ] =  $value ;      }             /**        * 存入缓存数据        * @param  array  $data          放入缓存的数据        * @param  string $id            缓存id(又名缓存识别码)        * @param  cache_life            缓存时间        * @return boolean True if no problem        */        static   function  save( $data ,  $id  = null,  $cache_life  = null)      {        $self  = & self::getInstance();           if  (! $id ) {               if  ( $self ->_id) {                   $id  =  $self ->_id;              }  else  {                   exit ( 'file_cache:save() id 不能为空!' );              }          }           $time  = time();                     if ( $cache_life ) {            $data [self::FILE_LIFE_KEY] =  $time  +  $cache_life ;          }     elseif     ( $cache_life  != 0){            $data [self::FILE_LIFE_KEY] =  $time  +  $self ->_options[ 'file_life' ];          }                     $file  =  $self ->_file( $id );                     $data  =  "<?phpn" .                   " // mktime: " .  $time .  "n" .                   " return " .                  var_export( $data , true).                   "n?>"                   ;                     $res  =  $self ->_filePutContents( $file ,  $data );           return   $res ;      }                   /**        * 得到缓存信息        *        * @param  string  $id  缓存id        * @return string|array 缓存数据        */        static   function  load( $id )      {           $self  = & self::getInstance();        $time  = time();        //检测缓存是否存在         if  (! $self ->test( $id )) {               // The cache is not hit !                return  false;          }               //全部清空识别文件            $clearFile  =  $self ->_file(self::CLEAR_ALL_KEY);         $file  =  $self ->_file( $id );               //判断缓存是否已被全部清除         if ( is_file ( $clearFile ) &&  filemtime ( $clearFile ) >  filemtime ( $file ))       {         return  false;       }                    $data  =  $self ->_fileGetContents( $file );         if ( empty empty ( $data [self::FILE_LIFE_KEY]) ||  $time  <  $data [self::FILE_LIFE_KEY]) {              unset( $data [self::FILE_LIFE_KEY]);           return   $data ;           }         return  false;      }                 /**        * 写入缓存文件        *        * @param  string $file   缓存路径        * @param  string $string 缓存信息        * @return boolean true 成功        */        protected   function  _filePutContents( $file ,  $string )      {        $self  = & self::getInstance();           $result  = false;           $f  = @ fopen ( $file ,  'ab+' );           if  ( $f ) {               if  ( $self ->_options[ 'file_locking' ]) @ flock ( $f , LOCK_EX);               fseek ( $f , 0);              ftruncate( $f , 0);               $tmp  = @fwrite( $f ,  $string );               if  (!( $tmp  === false)) {                   $result  = true;              }              @fclose( $f );          }          @ chmod ( $file ,  $self ->_options[ 'cache_file_umask' ]);           return   $result ;      }             /**        * 格式化后的缓存文件路径        *        * @param  string $id 缓存id        * @return string 缓存文件名(包括路径)        */        protected   function  _file( $id )      {        $self  = & self::getInstance();           $fileName  =  $self ->_idToFileName( $id );           return   $self ->_options[ 'cache_dir' ] .  $fileName ;      }                 /**        * 格式化后的缓存文件名字        *        * @param  string $id 缓存id        * @return string 缓存文件名        */        protected   function  _idToFileName( $id )      {        $self  = & self::getInstance();           $self ->_id =  $id ;           $prefix  =  $self ->_options[ 'file_name_prefix' ];           $result  =  $prefix  .  '---'  .  $id ;           return   $result ;      }                /**        * 判断缓存是否存在        *        * @param  string $id Cache id        * @return boolean True 缓存存在 False 缓存不存在        */        static   function  test( $id )      {        $self  = & self::getInstance();           $file  =  $self ->_file( $id );                     if  (! is_file ( $file )) {               return  false;          }                     return  true;      }             /**        * 得到缓存信息        *        * @param  string $file 缓存路径        * @return string 缓存内容        */        protected   function  _fileGetContents( $file )      {           if  (! is_file ( $file )) {               return  false;          }           return   include   $file ;      }                  /**        * 清除所有缓存        *         * @return void        */            static   function  clear()      {        $self  = & self::getInstance();        $self ->save( 'CLEAR_ALL' ,self::CLEAR_ALL_KEY);       }            /**        * 清除一条缓存        *         * @param string cache id          * @return void        */           static   function  del( $id )      {     $self  = & self::getInstance();        if (! $self ->test( $id )){         // 该缓存不存在          return  false;       }        $file  =  $self ->_file( $id );        return  unlink( $file );      }   }    存入数据    <?php  $config  =  array (    'name'  =>  'xiaojiong' ,    'qq'    =>  '290747680' ,    'age'   =>  '20' ,  );    //第一个参数 缓存data   //第二个参数 缓存id   //第三个参数 cache_life 0 永不过期(cache::clear()清空所有除外) 默认cache_life 为option_cache_life   cache::save( $config , 'config' ,0);    载入数据    <?php  //只有一个参数 cache_id   $config  = cache::load( 'config' );    清空缓存    <?php  //清空指定缓存   cache::del( 'config' );  //清空所有缓存   cache::clear();    cache信息配置    //在执行所有cache_func前调用     $_options  =  array (       'cache_dir'  =>  './cache' ,  //缓存文件目录        'file_name_prefix'  =>  'cache' , //缓存文件前缀        'file_life'   => 100000,  //缓存文件生命   );  cache::setOptions( $options );    //再执行 就会按着新配置信息执行,否则是默认信息   cache::save( $arr , 'arr' );    //就是这个方法 貌似不合理 望大家指点   ?> 

查看更多关于php文件缓存类实例整理 - php高级应用的详细内容...

  阅读:42次