一个PHP简单文件缓存类(php缓存机制有哪些)

网友投稿 1560 2022-07-30

缓存的工作原理

一个PHP简单文件缓存类(php缓存机制有哪些)

缓存的工作原理其实并不复杂。它的核心思想是:首先,我们将需要显示的内容存储在一个文本文件(即缓存文件)之中。然后,如果有用户请求某个页面的内容,我们首先检查此页对应的缓存(即那个文本文件)是否存在——如果存在且为最新的缓存文件,那么直接将这个文本文件中的内容输出到客户端供用户查看;如果此页对应的缓存文件不存在或缓存生成的时间不符合要求(太旧),那么直接执行一次此页对应的PHP文件,并将显示内容存储在缓存文件中。重复上述流程。这样一来,虽然增加了PHP代码,但我们最大程度的节省了PHP链接到数据库再提取数据的时间。

接下来,我们编写一个PHP缓存类来实现以上缓存原理。

任务目标

我们将创建的缓存类包含3个非常重要的过程函数:

starteCache()

endCache()

cleanCache()

PHP缓存类基本骨架

在我们具体编写这3个过程函数之前,我们需要创建这个PHP类的基本骨架,比如类的内外部变量;我们需要创建这个缓存类的一些变量,以方便使用时控制缓存功能的表现,请注意查看下面代码中的注释:

class Cache {

    var $status    = true;     // 值为True表示开启缓存;值False表示关闭缓存功能。

   var $cacheDir  = 'cache/'; //存放缓存文件的默认目录

   var $cacheFile = '';       //缓存文件的真实文件名

   var $timeOut   = 1000;     // 内容被重复使用的最长时限

   var $startTime = 0;        // 程序执行的开始时间

   var $caching     = true;     // 是否需要对内容进行缓存;值为False表示直接读取缓存文件内容

}

?>

除了以上变量声明外,我们还定义了一个常用函数用于获取执行此类所花费的时间。这就是getMicroTime()过程函数,如下:

    function getMicroTime() {

            list($usec, $sec) = explode(" ",microtime());

           return ((float)$usec + (float)$sec);

     }

?>

过程函数startCache()

现在我们开始编写这个缓存类中最重要的一个过程函数。函数startCache()的作用如下:

保存缓存类执行的

检查缓存文件是否存在以及缓存文件的时限(是否过期)。

如果缓存文件存在且没有超过最长时限,那么显示文件中的内容并退出 。

如果缓存文件不存在,那么置缓存标志Caching为False。

函数代码如下:

   function startCache(){

      $this->startTime = $this->getMicroTime();

      ob_start();

       if ($this->status){ 

         $this->cacheFile = $this->cacheDir.urlencode( $_SERVER['REQUEST_URI'] );

          if ( (file_exists($this->cacheFile)) && 

               ((fileatime($this->cacheFile) + $this->timeOut)> time()) )

          {

            //从缓存文件中读取内容

            $handle = fopen($this->cacheFile , "r");

            $html   = fread($handle,filesize($this->cacheFile));

            fclose($handle);

          

            // 显示内容

            echo $html;

            // 显示程序执行时间           

           echo '

Total time: '

                 .round(($this->getMicroTime())-($this->startTime),4).'

            

            //退出程序

            exit();

           }

           else

           {

             //置缓存标志caching为true

             $this->caching = true;

           }

       }

     }

?>

过程函数endCache()

如果实际页面尚未被缓存,并且caching标志被设置成True;那么此函数将首先将页面中的所有输出保存成缓存文件,然后显示页面。同样的,这个函数也会显示页面执行时间。我们可以在大数据量的情况下通过对比执行时间,发现缓存的优点。

   function endCache(){

       if ($this->status){

          if ( $this->caching )

          {

            //首先输出页面内容,然后将输出内容保存在缓存文件中

            $html = ob_get_clean();

             echo $html;

            $handle = fopen($this->cacheFile, 'w' );

            fwrite ($handle, $html );

            fclose ($handle);

            //显示页面执行时间            

            echo '

Total time: '.round(($this->getMicroTime()-$this->startTime),4).'

          }

       }       

     } 

?>

过程函数cleanCache()

这是核心函数的最后一个,也非常简单。此函数仅检查缓存文件夹是否存在,并移除对应的缓存文件。

    function cleanCache(){

        if ($handle = opendir($this->cacheDir)) {

           while (false !== ($file = readdir($handle))) {

              if (is_file($this->cacheDir.$file)) unlink($this->cacheDir.$file);

           }

          closedir($handle);       

        }

     }

?>

此PHP缓存类的使用

如果你希望完整的使用此PHP缓存类,你需要稍微对它进行功能拓展,但基本的功能它已经具备了。

在需要用到缓存的页面中,首先你需要导入我们已经编写好的缓存类,然后创建一个缓存类对象。在创建好的对象基础上,调用startCache() 函数,接着在这个函数下方你可以输出你想输出的内容,包括文字和HTML代码。最后,在页面的最下方,调用 endCache() 函数。这样,处于StartCache()函数和EndCache()函数之间的任何输出(比如echo,print,HTML代码)都将作为缓存写入缓存文件之中。

以下为使用此缓存类进行缓存的一个简单示例:

   //导入缓存类

   require_once('cache.class.php');

   //创建一个缓存类对象CacheManager

   $CacheManager = new Cache();

   //调用startCache方法,表示开始缓存

   $CacheManager->startCache();

   //以下区块所有echo内容都将作为缓存写入缓存文件中

    echo "Start Cache example at: ".date('H:i:s')."
";

   sleep(2);

    echo "End Cache example at: ".date('H:i:s')."
";

   

    echo "
Clean the cache
";

   //以上区块所有echo内容都将作为缓存写入缓存文件中

   $CacheManager->endCache();

?>

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:即将推出的CSS4 Level 4 Selectors(第4级选择器)
下一篇:PHP文件缓存类
相关文章

 发表评论

暂时没有评论,来抢沙发吧~