web/lib/Zend/Cache/Backend/Xcache.php
changeset 64 162c1de6545a
parent 19 1c2f13fd785c
child 68 ecaf28ffe26e
equal deleted inserted replaced
63:5b37998e522e 64:162c1de6545a
       
     1 <?php
       
     2 /**
       
     3  * Zend Framework
       
     4  *
       
     5  * LICENSE
       
     6  *
       
     7  * This source file is subject to the new BSD license that is bundled
       
     8  * with this package in the file LICENSE.txt.
       
     9  * It is also available through the world-wide-web at this URL:
       
    10  * http://framework.zend.com/license/new-bsd
       
    11  * If you did not receive a copy of the license and are unable to
       
    12  * obtain it through the world-wide-web, please send an email
       
    13  * to license@zend.com so we can send you a copy immediately.
       
    14  *
       
    15  * @category   Zend
       
    16  * @package    Zend_Cache
       
    17  * @subpackage Zend_Cache_Backend
       
    18  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    19  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    20  * @version    $Id: Xcache.php 23345 2010-11-15 16:31:14Z mabe $
       
    21  */
       
    22 
       
    23 
       
    24 /**
       
    25  * @see Zend_Cache_Backend_Interface
       
    26  */
       
    27 require_once 'Zend/Cache/Backend/Interface.php';
       
    28 
       
    29 /**
       
    30  * @see Zend_Cache_Backend
       
    31  */
       
    32 require_once 'Zend/Cache/Backend.php';
       
    33 
       
    34 
       
    35 /**
       
    36  * @package    Zend_Cache
       
    37  * @subpackage Zend_Cache_Backend
       
    38  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    39  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    40  */
       
    41 class Zend_Cache_Backend_Xcache extends Zend_Cache_Backend implements Zend_Cache_Backend_Interface
       
    42 {
       
    43 
       
    44     /**
       
    45      * Log message
       
    46      */
       
    47     const TAGS_UNSUPPORTED_BY_CLEAN_OF_XCACHE_BACKEND = 'Zend_Cache_Backend_Xcache::clean() : tags are unsupported by the Xcache backend';
       
    48     const TAGS_UNSUPPORTED_BY_SAVE_OF_XCACHE_BACKEND =  'Zend_Cache_Backend_Xcache::save() : tags are unsupported by the Xcache backend';
       
    49 
       
    50     /**
       
    51      * Available options
       
    52      *
       
    53      * =====> (string) user :
       
    54      * xcache.admin.user (necessary for the clean() method)
       
    55      *
       
    56      * =====> (string) password :
       
    57      * xcache.admin.pass (clear, not MD5) (necessary for the clean() method)
       
    58      *
       
    59      * @var array available options
       
    60      */
       
    61     protected $_options = array(
       
    62         'user' => null,
       
    63         'password' => null
       
    64     );
       
    65 
       
    66     /**
       
    67      * Constructor
       
    68      *
       
    69      * @param  array $options associative array of options
       
    70      * @throws Zend_Cache_Exception
       
    71      * @return void
       
    72      */
       
    73     public function __construct(array $options = array())
       
    74     {
       
    75         if (!extension_loaded('xcache')) {
       
    76             Zend_Cache::throwException('The xcache extension must be loaded for using this backend !');
       
    77         }
       
    78         parent::__construct($options);
       
    79     }
       
    80 
       
    81     /**
       
    82      * Test if a cache is available for the given id and (if yes) return it (false else)
       
    83      *
       
    84      * WARNING $doNotTestCacheValidity=true is unsupported by the Xcache backend
       
    85      *
       
    86      * @param  string  $id                     cache id
       
    87      * @param  boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
       
    88      * @return string cached datas (or false)
       
    89      */
       
    90     public function load($id, $doNotTestCacheValidity = false)
       
    91     {
       
    92         if ($doNotTestCacheValidity) {
       
    93             $this->_log("Zend_Cache_Backend_Xcache::load() : \$doNotTestCacheValidity=true is unsupported by the Xcache backend");
       
    94         }
       
    95         $tmp = xcache_get($id);
       
    96         if (is_array($tmp)) {
       
    97             return $tmp[0];
       
    98         }
       
    99         return false;
       
   100     }
       
   101 
       
   102     /**
       
   103      * Test if a cache is available or not (for the given id)
       
   104      *
       
   105      * @param  string $id cache id
       
   106      * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record
       
   107      */
       
   108     public function test($id)
       
   109     {
       
   110         if (xcache_isset($id)) {
       
   111             $tmp = xcache_get($id);
       
   112             if (is_array($tmp)) {
       
   113                 return $tmp[1];
       
   114             }
       
   115         }
       
   116         return false;
       
   117     }
       
   118 
       
   119     /**
       
   120      * Save some string datas into a cache record
       
   121      *
       
   122      * Note : $data is always "string" (serialization is done by the
       
   123      * core not by the backend)
       
   124      *
       
   125      * @param string $data datas to cache
       
   126      * @param string $id cache id
       
   127      * @param array $tags array of strings, the cache record will be tagged by each string entry
       
   128      * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
       
   129      * @return boolean true if no problem
       
   130      */
       
   131     public function save($data, $id, $tags = array(), $specificLifetime = false)
       
   132     {
       
   133         $lifetime = $this->getLifetime($specificLifetime);
       
   134         $result = xcache_set($id, array($data, time()), $lifetime);
       
   135         if (count($tags) > 0) {
       
   136             $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_XCACHE_BACKEND);
       
   137         }
       
   138         return $result;
       
   139     }
       
   140 
       
   141     /**
       
   142      * Remove a cache record
       
   143      *
       
   144      * @param  string $id cache id
       
   145      * @return boolean true if no problem
       
   146      */
       
   147     public function remove($id)
       
   148     {
       
   149         return xcache_unset($id);
       
   150     }
       
   151 
       
   152     /**
       
   153      * Clean some cache records
       
   154      *
       
   155      * Available modes are :
       
   156      * 'all' (default)  => remove all cache entries ($tags is not used)
       
   157      * 'old'            => unsupported
       
   158      * 'matchingTag'    => unsupported
       
   159      * 'notMatchingTag' => unsupported
       
   160      * 'matchingAnyTag' => unsupported
       
   161      *
       
   162      * @param  string $mode clean mode
       
   163      * @param  array  $tags array of tags
       
   164      * @throws Zend_Cache_Exception
       
   165      * @return boolean true if no problem
       
   166      */
       
   167     public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
       
   168     {
       
   169         switch ($mode) {
       
   170             case Zend_Cache::CLEANING_MODE_ALL:
       
   171                 // Necessary because xcache_clear_cache() need basic authentification
       
   172                 $backup = array();
       
   173                 if (isset($_SERVER['PHP_AUTH_USER'])) {
       
   174                     $backup['PHP_AUTH_USER'] = $_SERVER['PHP_AUTH_USER'];
       
   175                 }
       
   176                 if (isset($_SERVER['PHP_AUTH_PW'])) {
       
   177                     $backup['PHP_AUTH_PW'] = $_SERVER['PHP_AUTH_PW'];
       
   178                 }
       
   179                 if ($this->_options['user']) {
       
   180                     $_SERVER['PHP_AUTH_USER'] = $this->_options['user'];
       
   181                 }
       
   182                 if ($this->_options['password']) {
       
   183                     $_SERVER['PHP_AUTH_PW'] = $this->_options['password'];
       
   184                 }
       
   185 
       
   186                 $cnt = xcache_count(XC_TYPE_VAR);
       
   187                 for ($i=0; $i < $cnt; $i++) {
       
   188                     xcache_clear_cache(XC_TYPE_VAR, $i);
       
   189                 }
       
   190 
       
   191                 if (isset($backup['PHP_AUTH_USER'])) {
       
   192                     $_SERVER['PHP_AUTH_USER'] = $backup['PHP_AUTH_USER'];
       
   193                     $_SERVER['PHP_AUTH_PW'] = $backup['PHP_AUTH_PW'];
       
   194                 }
       
   195                 return true;
       
   196                 break;
       
   197             case Zend_Cache::CLEANING_MODE_OLD:
       
   198                 $this->_log("Zend_Cache_Backend_Xcache::clean() : CLEANING_MODE_OLD is unsupported by the Xcache backend");
       
   199                 break;
       
   200             case Zend_Cache::CLEANING_MODE_MATCHING_TAG:
       
   201             case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG:
       
   202             case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG:
       
   203                 $this->_log(self::TAGS_UNSUPPORTED_BY_CLEAN_OF_XCACHE_BACKEND);
       
   204                 break;
       
   205             default:
       
   206                 Zend_Cache::throwException('Invalid mode for clean() method');
       
   207                 break;
       
   208         }
       
   209     }
       
   210 
       
   211     /**
       
   212      * Return true if the automatic cleaning is available for the backend
       
   213      *
       
   214      * @return boolean
       
   215      */
       
   216     public function isAutomaticCleaningAvailable()
       
   217     {
       
   218         return false;
       
   219     }
       
   220 
       
   221 }