wtuyss 发表于 2015-8-23 17:10:27

收藏一个Php的Cache类

  Cache的作用不用说大家都知道咯,这些天也面试了一些人,发现很多人框架
  用多了,基础都忘记了,你问一些事情,他总是说框架解决了,而根本不明白
  是怎么回事,所以也提醒大家应该注意平时基础知识的积累,之后对一些问
  题才能游刃有余.
  群里也有些朋友对基础知识很不屑,总说有能力就可以了,
  基础知识考不出来什么.对于这样的观点,我一直不苟同.
  这个只是一点感概罢了. 下面看正题,介绍一个php的Cache类:
  
  All the code here is covered by the PHPGuru license. A short summary is that for any sort of commercial use there is a small one-off licensing fee to pay, and for charity and educational use there is a reduced license fee.
  You can read more about licensing here (where there's also a link to Google Checkout).
  
  贴一下代码吧:下面也有下载地址,其实很简单,重要的是学习

代码

<?php
    /**
    * o------------------------------------------------------------------------------o
    * | This package is licensed under the Phpguru license. A quick summary is       |
    * | that for commercial use, there is a small one-time licensing fee to pay. For |
    * | registered charities and educational institutes there is a reduced license   |
    * | fee available. You can read moreat:                                        |
    * |                                                                              |
    * |                  http://www.phpguru.org/static/license.html                  |
    * o------------------------------------------------------------------------------o
    */

/**
* Caching Libraries for PHP5
*
* Handles data and output caching. Defaults to /dev/shm
* (shared memory). All methods are static.
*
* Eg: (output caching)
*
* if (!OutputCache::Start('group', 'unique id', 600)) {
*
*   // ... Output
*
*   OutputCache::End();
* }
*
* Eg: (data caching)
*
* if (!$data = DataCache::Get('group', 'unique id')) {
*
*   $data = time();
*
*   DataCache::Put('group', 'unique id', 10, $data);
* }
*
* echo $data;
*/
    class Cache
    {
      /**
      * Whether caching is enabled
      * @var bool
      */
      public static $enabled = true;
      /**
      * Place to store the cache files
      * @var string可以根据需要修改存储路径,例如当前的cache目录下
      */
      protected static $store = '/dev/shm/';
      
      /**
      * Prefix to use on cache files
      * @var string
      */
      protected static $prefix = 'cache_';
      /**
      * Stores data
      *
      * @param string $group Group to store data under
      * @param string $id    Unique ID of this data
      * @param int    $ttl   How long to cache for (in seconds)
      */
      protected static function write($group, $id, $ttl, $data)
      {
            $filename = self::getFilename($group, $id);
            
            if ($fp = @fopen($filename, 'xb')) {
            
                if (flock($fp, LOCK_EX)) {
                  fwrite($fp, $data);
                }
                fclose($fp);
               
                // Set filemtime
                touch($filename, time() + $ttl);
            }
      }
      
      /**
      * Reads data
      *
      * @param string $group Group to store data under
      * @param string $id    Unique ID of this data
      */
      protected static function read($group, $id)
      {
            $filename = self::getFilename($group, $id);
            
            return file_get_contents($filename);
      }
      
      /**
      * Determines if an entry is cached
      *
      * @param string $group Group to store data under
      * @param string $id    Unique ID of this data
      */
      protected static function isCached($group, $id)
      {
            $filename = self::getFilename($group, $id);
            if (self::$enabled && file_exists($filename) && filemtime($filename) > time()) {
                return true;
            }
            @unlink($filename);
            return false;
      }
      
      /**
      * Builds a filename/path from group, id and
      * store.
      *
      * @param string $group Group to store data under
      * @param string $id    Unique ID of this data
      */
      protected static function getFilename($group, $id)
      {
            $id = md5($id);
            return self::$store . self::$prefix . "{$group}_{$id}";
      }
      
      /**
      * Sets the filename prefix to use
      *
      * @param string $prefix Filename Prefix to use
      */
      public static function setPrefix($prefix)
      {
            self::$prefix = $prefix;
      }
      /**
      * Sets the store for cache files. Defaults to
      * /dev/shm. Must have trailing slash.
      *
      * @param string $store The dir to store the cache data in
      */
      public static function setStore($store)
      {
            self::$store = $store;
      }
    }
   
    /**
    * Output Cache extension of base caching class
    */
    class OutputCache extends Cache
    {
      /**
      * Group of currently being recorded data
      * @var string
      */
      private static $group;
      
      /**
      * ID of currently being recorded data
      * @var string
      */
      private static $id;
      
      /**
      * Ttl of currently being recorded data
      * @var int
      */
      private static $ttl;
      /**
      * Starts caching off. Returns true if cached, and dumps
      * the output. False if not cached and start output buffering.
      *
      * @paramstring $group Group to store data under
      * @paramstring $id    Unique ID of this data
      * @paramint    $ttl   How long to cache for (in seconds)
      * @return bool          True if cached, false if not
      */
      public static function Start($group, $id, $ttl)
      {
            if (self::isCached($group, $id)) {
                echo self::read($group, $id);
                return true;
            
            } else {
               
                ob_start();
               
                self::$group = $group;
                self::$id    = $id;
                self::$ttl   = $ttl;
               
                return false;
            }
      }
      
      /**
      * Ends caching. Writes data to disk.
      */
      public static function End()
      {
            $data = ob_get_contents();
            ob_end_flush();
            
            self::write(self::$group, self::$id, self::$ttl, $data);
      }
    }
   
    /**
    * Data cache extension of base caching class
    */
    class DataCache extends Cache
    {
   
      /**
      * Retrieves data from the cache
      *
      * @paramstring $group Group this data belongs to
      * @paramstring $id    Unique ID of the data
      * @return mixed         Either the resulting data, or null
      */
      public static function Get($group, $id)
      {
            if (self::isCached($group, $id)) {
                return unserialize(self::read($group, $id));
            }
            
            return null;
      }
      
      /**
      * Stores data in the cache
      *
      * @param string $group Group this data belongs to
      * @param string $id    Unique ID of the data
      * @param int    $ttl   How long to cache for (in seconds)
      * @param mixed$dataThe data to store
      */
      public static function Put($group, $id, $ttl, $data)
      {
            self::write($group, $id, $ttl, serialize($data));
      }
    }
?>  
  下载地址:http://www.phpguru.org/downloads/Cache/
  顺便说一下,这个网站也不错:http://www.phpguru.org/
  
页: [1]
查看完整版本: 收藏一个Php的Cache类