个人技术作品 - PHP Page Cache 页面缓存类

PAGE_CACHE.PHP 
<? php
/*  $cache = new Cache("../cache/",20); // 构造函数,创建缓存类对象 
   ………………………………
   ………………………………
   ………………………………
   $cache->PutCache();  // 倒出缓存   
*/
class  Cache
{
    
private   $CacheDir   =   ' Cache ' ;      /*  缓存目录  */
    
private   $SetTimeOut   =   10 ;         /*  缓存过期时间  */
    
private   $SetExt   =   ' .cache ' ;       /*  缓存文件后缀名  */
    
private   $CacheFileUrl   =   '' ;       /*  缓存文件所在地址  */
    
private   $CacheConfigFile   =   '' ;   /*  缓存文件配置信息  */
    
    
public   $LastUnixTimePoke   =   0 ;    /*  上一次缓存的 Unix 时间戳  */
    
public   $CurrentUnixTimePoke   =   0 ; /*  当前缓存的 Unix 时间戳  */
    
public   $NextUnixTimePoke   =   0 ;    /*  下一次缓存的 Unix 时间戳  */
    
public   $UnixNowToNext   =   0 ;         /*  现在和下一次缓存相差的 Unix 时间戳  */
    
    
public   $LastTimePoke   =   0 ;    /*  上一次缓存的时间  */
    
public   $CurrentTimePoke   =   0 ; /*  当前缓存的时间  */
    
public   $NextTimePoke   =   0 ;    /*  下一次缓存的时间  */
    
    
public   $DataLength   =   0 /*  缓存区内容长度  */
    
public   $CacheToPage   =   '' /*  缓存文件内容  */
    
private   $SplitTeam   =   false ;   /*  是否分组存放Cache文件  */
    
    
public   $Cache   =   false ;         /*  是否需要缓存,用户外界判断  */
    
    
private   $_IsCache   =   false /*  是否能够缓存  */
    
     
public   function  Cache( $SetTimeOut   =   20 , $CacheDir   =   ' Cache ' , $SplitTeam   =   false , $SetExt   =   ' .cache ' )
    {
        
$this -> CacheDir  =   $CacheDir ;
        
$this -> SplitTeam  =   $SplitTeam ;
        
if ( ! is_numeric ( $SetTimeOut ))
        {
            
$this -> ErrResponse( ' 缓存过期时间设置无效 ' );
            
return   false ;
        } 
else  {
            
$this -> SetTimeOut  =   $SetTimeOut ;
        }
        
$this -> SetExt  =   $SetExt ;
        
        
/*  缓存开始  */
        
ob_clean ();
        
ob_start ();
        
ob_implicit_flush ( 0 );
        
$this -> CreateCache();
        
return   true ;
    }
    
    
private   function  CreateCache()
    {
        
$_CacheFile   =   str_replace ( ' . ' , ' _ ' , basename ( $_SERVER [ ' PHP_SELF ' ]))  .   ' _ '   .
                      
md5 ( basename ( $_SERVER [ ' PHP_SELF ' ]))  .   $this -> SetExt;
        
$_CacheConfig   =   str_replace ( ' . ' , ' _ ' , basename ( $_SERVER [ ' PHP_SELF ' ]))  .   ' _ '   .   ' .cof ' ;
        
        
if ( ! file_exists ( $this -> CacheDir))
        {
            
mkdir ( $this -> CacheDir , 0777 );
        }
        
        
if ( $this -> SplitTeam)
        {
            
$_CacheConfigDir   =   $this -> CacheDir  .   str_replace ( ' . ' , ' _ ' , basename ( $_SERVER [ ' PHP_SELF ' ]))  .   ' _/ ' ;
            
if ( ! file_exists ( $_CacheConfigDir ))
            {
                
mkdir ( $_CacheConfigDir , 0777 );
            }
            
$_CacheUrl   =   $this -> CacheDir  .   $_CacheConfigDir   .   $_CacheFile ;
            
$_CacheConfigUrl   =   $this -> CacheDir  .   $_CacheConfigDir   .   $_CacheConfig ;
        } 
else  {
            
$_CacheUrl   =   $this -> CacheDir  .   $_CacheFile ;
            
$_CacheConfigUrl   =   $this -> CacheDir  .   $_CacheConfig ;
        }

        
if ( ! file_exists ( $_CacheUrl ))
        {
            
$hanld   =  @ fopen ( $_CacheUrl , " w " );
            @
fclose ( $hanld );
        }
        
        
if ( ! file_exists ( $_CacheConfigUrl ))
        {
            
$hanld   =  @ fopen ( $_CacheConfigUrl , " w " );
            @
fclose ( $hanld );
        }
        
        
$this -> CacheConfigFile  =   $_CacheConfigUrl ;
        
$this -> CacheFileUrl  =   $_CacheUrl ;
        
$this -> CheckCache();
        
return   true ;
    }
    
    
private   function  CheckCache()
    {
        
$_FileEditTime   =  @ filemtime ( $this -> CacheFileUrl);
        
$_TimeOut   =   $this -> SetTimeOut;
        
$_IsTimeOut   =   $_FileEditTime   +   $_TimeOut ;

        
$this -> LastUnixTimePoke  =   $_FileEditTime ;
        
$this -> NextUnixTimePoke  =   $_IsTimeOut ;
        
$this -> CurrentUnixTimePoke  =   time ();
        
$this -> UnixNowToNext  =   $this -> NextUnixTimePoke  -   time ();
            
        
$this -> LastTimePoke  =   date ( " Y-m-d H:i:s " , $_FileEditTime );
        
$this -> NextTimePoke  =   date ( " Y-m-d H:i:s " , $_IsTimeOut );
        
$this -> CurrentTimePoke  =   date ( " Y-m-d H:i:s " , time ());

        
$_TxtInformation   =   " 上次缓存时间戳: $this->LastUnixTimePoke " ;
        
$_TxtInformation   .=   " 当前缓存时间戳: $this->CurrentUnixTimePoke " ;
        
$_TxtInformation   .=   " 下次缓存时间戳: $this->NextUnixTimePoke " ;

        
$_TxtInformation   .=   " 上次缓存时间: $this->LastTimePoke " ;
        
$_TxtInformation   .=   " 当前缓存时间: $this->CurrentTimePoke " ;
        
$_TxtInformation   .=   " 下次缓存时间: $this->NextTimePoke " ;

        
$_TxtInformation   .=   " 距离下次缓存戳: $this->UnixNowToNext " ;

        
$handl   =  @ fopen ( $this -> CacheConfigFile , ' w ' );
        
if ( $handl )
        {
            @
fwrite ( $handl , $_TxtInformation );
            @
fclose ( $handl );
        }
        
        
if ( $_IsTimeOut   >=   time ())
        {
            
$this -> GetCacheData();
        }
    }
    
    
private   function  ClearCacheFile()
    {
        @
unlink ( $this -> CacheFileUrl);
        @
unlink ( $this -> CacheConfigFile);
    }
    
    
public   function  PutCache()
    {
        
$this -> DataLength  =   ob_get_length ();
        
$PutData   =   ob_get_contents ();
        
if ( ! file_exists ( $this -> CacheFileUrl))
        {
            
$CreateOK   =   $this -> CreateCache();
            
if ( ! $CreateOK )
            {
                
$this -> ErrResponse( ' 检查缓存文件时产生错误,缓存文件创建失败 ' );
                
return   false ;
            }
        } 
else  {
            
$hanld   =  @ fopen ( $this -> CacheFileUrl , " w " );
            
if ( $hanld )
            {
                
if (@ is_writable ( $this -> CacheFileUrl))
                {
                    @
flock ( $hanld ,  LOCK_EX);
                    
$_PutData   =  @ fwrite ( $hanld , $PutData );
                    @
flock ( $hanld ,  LOCK_UN);
                    
if ( ! $_PutData )
                    {
                        
$this -> ErrResponse( ' 无法更改当前缓存文件内容 ' );
                        
return   false ;
                    } 
else  {
                        @
fclose ( $hanld );
                        
return   true ;
                    }
                } 
else  {
                    
$this -> ErrResponse( ' 缓存文件不可写 ' );
                    
return   false ;
                }
            } 
else  {
                
$this -> ErrResponse( ' 打开缓存文件发生致命错误 ' );
                
return   false ;
            }
        }
    }
    
    
public   function  GetCacheData()
    {
        
$hanld   =  @ fopen ( $this -> CacheFileUrl , " r " );
        
if ( $hanld )
        {
            
if (@ is_readable ( $this -> CacheFileUrl))
            {
                
$this -> CacheToPage  =  @ file_get_contents ( $this -> CacheFileUrl);
                
$IsEmpty   =   count ( file ( $this -> CacheFileUrl));   // 判断缓存文件是否为空
                 if ( $IsEmpty   >   0 )
                {
                    
echo   $this -> CacheToPage;
                    @
fclose ( $hanld );
                      
ob_end_flush ();
                      
exit ();
                }
            } 
else  {
                
$this -> ErrResponse( ' 读取缓存文件内容失败 ' );
                
return   false ;
            }
        } 
else  {
            
$this -> ErrResponse( ' 打开缓存文件失败 ' );
            
return   false ;
        }
    }
    
    
private   function  ErrResponse( $Msg )
    {
        
echo   $Msg ;
    }
}
?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值