• PHP那些事:数据库缓存原理
    时间:2008-09-09   作者:佚名   出处:互联网

      如果后台应用接收到浏览器端的查询请求后,每次都与数据库连接读取数据,势必增加数据库的负担。而往往有大量的请求是重复的,我们可以把这些重复的信息采用缓存技术保存下来,重复使用,这样,在某些情况下可以大大提高程序的性能。

      1,缓存函数

      cache_write函数接受$string参数,写到$file文件中。注意var_export函数,作用是:
      此函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。您可以通过将函数的第二个参数设置为 TRUE,从而返回变量的表示。
      这些参数可以是数组或常量,而这些数组或常量通常为从数据库中取出的记录,或非序列化(unserialize)对象后得到的数据。这些都可以缓存到本地的文本文件中。
      cache_write函数很简单,需要读取数据时,先判断缓存是否存在,存在的话就不去连接数据库取数据,而是直接读出缓存的文本文件,直接产生了数组或常量等类型的数据,可以直接使用。

      <?php
      //文件名func.inc.php
      define("CACHEDIR", "./");  //定义缓存文件夹
      function cache_write($file, $string, $type = 'array')
      {
       if(is_array($string))
       {
        $type = strtolower($type);
        if($type == 'array')
        {
         $string = "<?php\n return ".var_export($string,TRUE).";\n?>";
        }
        elseif($type == 'constant')
        {
         $data='';
         foreach($string as $key => $value)
           $data .= "define('".strtoupper($key)."','".addslashes($value)."');\n";
         $string = "<?php\n".$data."\n?>";
        }
       }
       $strlen = file_put_contents(CACHEDIR.$file, $string);
       chmod(CACHEDIR.$file, 0777);
       return $strlen;
      }

      function cache_read($file)
      {
       $cachefile = CACHEDIR.$file;
       if(!file_exists($cachefile))
         return array();
       return include $cachefile;
      }

      function cache_delete($file)
      {
       return @unlink(CACHEDIR.$file);
      }

      if(!function_exists('file_put_contents'))
      {
       define('FILE_APPEND', 8);
       function file_put_contents($file, $string, $append = '')
       {
        $mode = $append == '' ? 'wb' : 'ab';
        $fp = @fopen($file, $mode) or exit("Can not open file $file !");
        flock($fp, LOCK_EX);
        $stringlen = @fwrite($fp, $string);
        flock($fp, LOCK_UN);
        @fclose($fp);
        return $stringlen;
       }
      }
      ?>

      2,写缓存和读取的示例
        <?php
            //写缓存
          include "func.inc.php";
        
          $arr = array (1, 2, array ("a", "b", "c"));
          cache_write('test.cache.php', $arr);  //缓存文件 test.cache.php
          ?>

        <?php
            //读缓存
          include "func.inc.php";
        
          $var = cache_read('test.cache.php');
          print_r($new_var);
        
          print_r($var);
        
          foreach ($var as $k=>$v)
          {
            echo '<br>' . $k . '=' . $v ;
          }
            ?>

        3,性能分析

        缓存之所以能提高性能,是通过本地磁盘空间换网络存取速度和数据库服务器存取时间的结果。
        a = 本机读写时间
        b = 本机占用空间
        c = 网络传输时间
        d = 数据库服务器磁盘时间

        可以估算到,如果数据库与应用程序存在于一台机器时,主要是 a 与 d 的比较,效果可能并不明显,甚至还要糟一点。因为数据库系统针对磁盘存取经过了精心优化,是操作系统对文件的普通读写无法相比的。

        如果本机的磁盘存取效率不佳,有时从局域网的数据库上取得数据,可能比从本机的缓存取数据还快,这种情况比较少见。而随着请求数量的大量增加,缓存的效果就会明显起来。

    网友留言/评论

    我要留言/评论