来自phpguru得Php Cache类源码

  Cache的作用不用说大家都知道咯,这些天也面试了一些人,发现很多人框架用多了,基础都忘记了,你问一些事情,他总是说框架解决了,而根本不明白是怎么回事,所以也提醒大家应该注意平时基础知识的积累,之后对一些问题才能游刃有余.

  群里也有些朋友对基础知识很不屑,总说有能力就可以了,基础知识考不出来什么.对于这样的观点,我一直不苟同.

  这个只是一点感概罢了. 下面看正题,介绍一个php的Cache类:

  贴一下代码吧:下面也有下载地址,其实很简单,重要的是学习

  

复制代码 代码如下:

  <?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 more at: |

  * | |

  * | 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

  */

  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.

  *

  * @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)

  * @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

  *

  * @param string $group Group this data belongs to

  * @param string $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 $data The data to store

  */

  public static function Put($group, $id, $ttl, $data)

  {

  self::write($group, $id, $ttl, serialize($data));

  }

  }

  ?>

  使用方法:

  

复制代码 代码如下:

  $dir = !empty($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : '.';

  $dh = opendir($dir);

  while ($filename = readdir($dh)) {

  if ($filename == '.' OR $filename == '..') {

  continue;

  }

  if (filemtime($dir . DIRECTORY_SEPARATOR . $filename) < time()) {

  unlink($dir . DIRECTORY_SEPARATOR . $filename);

  }

  }

  源码打包下载