Cache
[ class tree: Cache ] [ index: Cache ] [ all elements ]

Source for file Cache.php

Documentation is available at Cache.php

  1. <?php
  2. // +----------------------------------------------------------------------+
  3. // | PEAR :: Cache                                                        |
  4. // +----------------------------------------------------------------------+
  5. // | Copyright (c) 1997-2003 The PHP Group                                |
  6. // +----------------------------------------------------------------------+
  7. // | This source file is subject to version 2.0 of the PHP license,       |
  8. // | that is bundled with this package in the file LICENSE, and is        |
  9. // | available at through the world-wide-web at                           |
  10. // | http://www.php.net/license/2_02.txt.                                 |
  11. // | If you did not receive a copy of the PHP license and are unable to   |
  12. // | obtain it through the world-wide-web, please send a note to          |
  13. // | license@php.net so we can mail you a copy immediately.               |
  14. // +----------------------------------------------------------------------+
  15. // | Authors: Ulf Wendel <ulf.wendel@phpdoc.de>                           |
  16. // |          Sebastian Bergmann <sb@sebastian-bergmann.de>               |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id: Cache.php 316194 2011-09-05 20:35:25Z cweiske $
  20.  
  21. require_once 'PEAR.php';
  22. require_once 'Cache/Error.php';
  23.  
  24. /**
  25. * Cache is a base class for cache implementations.
  26. *
  27. * The pear cache module is a generic data cache which can be used to
  28. * cache script runs. The idea behind the cache is quite simple. If you have
  29. * the same input parameters for whatever tasks/algorithm you use you'll
  30. * usually get the same output. So why not caching templates, functions calls,
  31. * graphic generation etc. Caching certain actions e.g. XSLT tranformations
  32. * saves you lots of time.
  33. *
  34. * The design of the cache reminds of PHPLibs session implementation. A
  35. * (PHPLib: session) controller uses storage container (PHPLib: ct_*.inc) to save
  36. * certain data (PHPLib: session data). In contrast to the session stuff it's up to
  37. * you to generate an ID for the data to cache. If you're using the output cache
  38. * you might use the script name as a seed for cache::generateID(), if your using the
  39. * function cache you'd use an array with all function parameters.
  40. *
  41. * Usage example of the generic data cache:
  42. *
  43. * require_once('Cache.php');
  44. *
  45. * $cache = new Cache('file', array('cache_dir' => 'cache/') );
  46. * $id = $cache->generateID('testentry');
  47. *
  48. * if ($data = $cache->get($id)) {
  49. *    print "Cache hit.<br>Data: $data";
  50. *
  51. * } else {
  52. *   $data = 'data of any kind';
  53. *   $cache->save($id, $data);
  54. *   print 'Cache miss.<br>';
  55. * }
  56. *
  57. * WARNING: No File/DB-Table-Row locking is implemented yet,
  58. *          it's possible, that you get corrupted data-entries under
  59. *          bad circumstances  (especially with the file container)
  60. *
  61. @author   Ulf Wendel <ulf.wendel@phpdoc.de>
  62. @version  $Id: Cache.php 316194 2011-09-05 20:35:25Z cweiske $
  63. @package  Cache
  64. @access   public
  65. */
  66. class Cache extends PEAR
  67. {
  68.  
  69.     /**
  70.     * Enables / disables caching.
  71.     *
  72.     * TODO: Add explanation what this is good for.
  73.     *
  74.     * @var      boolean 
  75.     * @access   private
  76.     */
  77.     var $caching = true;
  78.  
  79.     /**
  80.     * Garbage collection: probability in seconds
  81.     *
  82.     * If set to a value above 0 a garbage collection will
  83.     * flush all cache entries older than the specified number
  84.     * of seconds.
  85.     *
  86.     * @var      integer 
  87.     * @see      $gc_probability, $gc_maxlifetime
  88.     * @access   public
  89.     */
  90.     var $gc_time  = 1;
  91.  
  92.     /**
  93.     * Garbage collection: probability in percent
  94.     *
  95.     * TODO: Add an explanation.
  96.     *
  97.     * @var      integer     0 => never
  98.     * @see      $gc_time, $gc_maxlifetime
  99.     * @access   public
  100.     */
  101.     var $gc_probability = 1;
  102.  
  103.     /**
  104.     * Garbage collection: delete all entries not use for n seconds.
  105.     *
  106.     * Default is one day, 60 * 60 * 24 = 86400 seconds.
  107.     *
  108.     * @var  integer 
  109.     * @see  $gc_probability, $gc_time
  110.     */
  111.     var $gc_maxlifetime = 86400;
  112.  
  113.     /**
  114.     * Storage container if sucess in load it
  115.     * and a Cache_Error if not
  116.     *
  117.     * @var  Cache_Container|Cache_Error$container 
  118.     */
  119.     var $container;
  120.  
  121.     //
  122.     // public methods
  123.     //
  124.  
  125.     /**
  126.     * this Constructor set the Container Property as
  127.     * a Cache_Container|Cache_Error Object.
  128.     * it Depends if a container is sucessfully  load
  129.     * if not, a Cache_Error is set
  130.     *
  131.     * @param    string  Name of container class
  132.     * @param    array   Array with container class options
  133.     */
  134.     function Cache($container$container_options = null)
  135.     {
  136.         if (!is_array($container_options&& !is_null($container_options)) {
  137.             $this->container = new Cache_Error(
  138.                 "Cache-Error: container Options must be empty or an Array"
  139.             );
  140.             return;
  141.         }
  142.         $this->PEAR();
  143.         $container strtolower($container);
  144.         $container_class 'Cache_Container_' $container;
  145.         $container_classfile 'Cache/Container/' $container '.php';
  146.  
  147.         @include_once $container_classfile;
  148.         if (class_exists($container_class)) {
  149.                 $this->container = new $container_class($container_options);
  150.         else {
  151.             $this->container = new Cache_Error(
  152.                 "The Container requested {$container} is not supported"
  153.             );
  154.         }
  155.     }
  156.  
  157.     //deconstructor
  158.     function _Cache()
  159.     {
  160.         $this->garbageCollection();
  161.     }
  162.  
  163.     /**
  164.      * Returns the current caching state.
  165.      *
  166.      * @return  boolean     The current caching state.
  167.      * @access  public
  168.      */
  169.     function getCaching()
  170.     {
  171.         return $this->caching;
  172.     }
  173.  
  174.     /**
  175.      * Enables or disables caching.
  176.      *
  177.      * @param   boolean     The new caching state.
  178.      * @access  public
  179.      */
  180.     function setCaching($state)
  181.     {
  182.         $this->caching $state;
  183.     }
  184.  
  185.     /**
  186.     * Returns the requested dataset it if exists and is not expired
  187.     *
  188.     * @param    string  dataset ID
  189.     * @param    string  cache group
  190.     * @return   mixed   cached data or null on failure
  191.     * @access   public
  192.     */
  193.     function get($id$group 'default')
  194.     {
  195.         if (!$this->caching{
  196.             return '';
  197.         }
  198.  
  199.         if ($this->isCached($id$group&& !$this->isExpired($id$group)) {
  200.             return $this->load($id$group);
  201.         }
  202.         return null;
  203.     // end func get
  204.  
  205.     /**
  206.     * Stores the given data in the cache.
  207.     *
  208.     * @param    string  dataset ID used as cache identifier
  209.     * @param    mixed   data to cache
  210.     * @param    integer lifetime of the cached data in seconds - 0 for endless
  211.     * @param    string  cache group
  212.     * @return   boolean 
  213.     * @access   public
  214.     */
  215.     function save($id$data$expires = 0$group 'default')
  216.     {
  217.         if (!$this->caching{
  218.             return true;
  219.         }
  220.         return $this->extSave($id$data'',$expires$group);
  221.     // end func save
  222.  
  223.     /**
  224.     * Stores a dataset with additional userdefined data.
  225.     *
  226.     * @param    string  dataset ID
  227.     * @param    mixed   data to store
  228.     * @param    string  additional userdefined data
  229.     * @param    mixed   userdefined expire date
  230.     * @param    string  cache group
  231.     * @return   boolean 
  232.     * @throws   Cache_Error
  233.     * @access   public
  234.     * @see      getUserdata()
  235.     */
  236.     function extSave($id$cachedata$userdata$expires = 0$group 'default')
  237.     {
  238.         if (!$this->caching{
  239.             return true;
  240.         }
  241.         return $this->container->save($id$cachedata$expires$group$userdata);
  242.     // end func extSave
  243.  
  244.     /**
  245.     * Loads the given ID from the cache.
  246.     *
  247.     * @param    string  dataset ID
  248.     * @param    string  cache group
  249.     * @return   mixed   cached data or null on failure
  250.     * @access   public
  251.     */
  252.     function load($id$group 'default')
  253.     {
  254.         if (!$this->caching{
  255.             return '';
  256.         }
  257.         return $this->container->load($id$group);
  258.     // end func load
  259.  
  260.     /**
  261.     * Returns the userdata field of a cached data set.
  262.     *
  263.     * @param    string  dataset ID
  264.     * @param    string  cache group
  265.     * @return   string  userdata
  266.     * @access   public
  267.     * @see      extSave()
  268.     */
  269.     function getUserdata($id$group 'default')
  270.     {
  271.         if (!$this->caching{
  272.             return '';
  273.         }
  274.         return $this->container->getUserdata($id$group);
  275.     // end func getUserdata
  276.  
  277.     /**
  278.     * Removes the specified dataset from the cache.
  279.     *
  280.     * @param    string  dataset ID
  281.     * @param    string  cache group
  282.     * @return   boolean 
  283.     * @access   public
  284.     */
  285.     function remove($id$group 'default')
  286.     {
  287.         if (!$this->caching{
  288.             return true;
  289.         }
  290.         return $this->container->remove($id$group);
  291.     // end func remove
  292.  
  293.     /**
  294.     * Flushes the cache - removes all data from it
  295.     *
  296.     * @param    string  cache group, if empty all groups will be flashed
  297.     * @return   integer number of removed datasets
  298.     */
  299.     function flush($group 'default')
  300.     {
  301.         if (!$this->caching{
  302.             return true;
  303.         }
  304.         return $this->container->flush($group);
  305.     // end func flush
  306.  
  307.     /**
  308.     * Checks if a dataset exists.
  309.     *
  310.     * Note: this does not say that the cached data is not expired!
  311.     *
  312.     * @param    string  dataset ID
  313.     * @param    string  cache group
  314.     * @return   boolean 
  315.     * @access   public
  316.     */
  317.     function isCached($id$group 'default')
  318.     {
  319.         if (!$this->caching{
  320.             return false;
  321.         }
  322.         return $this->container->isCached($id$group);
  323.     // end func isCached
  324.  
  325.     /**
  326.     * Checks if a dataset is expired
  327.     *
  328.     * @param    string  dataset ID
  329.     * @param    string  cache group
  330.     * @param    integer maximum age for the cached data in seconds - 0 for endless
  331.     *                    If the cached data is older but the given lifetime it will
  332.     *                    be removed from the cache. You don't have to provide this
  333.     *                    argument if you call isExpired(). Every dataset knows
  334.     *                    it's expire date and will be removed automatically. Use
  335.     *                    this only if you know what you're doing...
  336.     * @return   boolean 
  337.     * @access   public
  338.     */
  339.     function isExpired($id$group 'default'$max_age = 0)
  340.     {
  341.         if (!$this->caching{
  342.             return true;
  343.         }
  344.         return $this->container->isExpired($id$group$max_age);
  345.     // end func isExpired
  346.  
  347.     /**
  348.     * Generates a "unique" ID for the given value
  349.     *
  350.     * This is a quick but dirty hack to get a "unique" ID for a any kind of variable.
  351.     * ID clashes might occur from time to time although they are extreme unlikely!
  352.     *
  353.     * @param    mixed   variable to generate a ID for
  354.     * @return   string  "unique" ID
  355.     * @access   public
  356.     */
  357.     function generateID($variable)
  358.     {
  359.         // WARNING: ID clashes are possible although unlikely
  360.         return md5(serialize($variable));
  361.     }
  362.  
  363.     /**
  364.     * Calls the garbage collector of the storage object with a certain probability
  365.     *
  366.     * @param    boolean Force a garbage collection run?
  367.     * @see  $gc_probability, $gc_time
  368.     */
  369.     function garbageCollection($force = false)
  370.     {
  371.         static $last_run = 0;
  372.  
  373.         if (!$this->caching{
  374.             return;
  375.         }
  376.  
  377.         // time and probability based
  378.         if (($force|| ($last_run && $last_run < time($this->gc_time|| (rand(1100$this->gc_probability)) {
  379.             $this->container->garbageCollection($this->gc_maxlifetime);
  380.             $last_run = time();
  381.         }
  382.     // end func garbageCollection
  383.  
  384. // end class cache
  385. ?>

Documentation generated on Mon, 11 Mar 2019 15:44:49 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.