00001 <?php
00027 require_once 'Zend/Cache/Backend/Interface.php';
00028
00032 require_once 'Zend/Cache/Backend.php';
00033
00034
00041 class Zend_Cache_Backend_Xcache extends Zend_Cache_Backend implements Zend_Cache_Backend_Interface
00042 {
00043
00047 const TAGS_UNSUPPORTED_BY_CLEAN_OF_XCACHE_BACKEND = 'Zend_Cache_Backend_Xcache::clean() : tags are unsupported by the Xcache backend';
00048 const TAGS_UNSUPPORTED_BY_SAVE_OF_XCACHE_BACKEND = 'Zend_Cache_Backend_Xcache::save() : tags are unsupported by the Xcache backend';
00049
00061 protected $_options = array(
00062 'user' => null,
00063 'password' => null
00064 );
00065
00073 public function __construct(array $options = array())
00074 {
00075 if (!extension_loaded('xcache')) {
00076 Zend_Cache::throwException('The xcache extension must be loaded for using this backend !');
00077 }
00078 parent::__construct($options);
00079 }
00080
00090 public function load($id, $doNotTestCacheValidity = false)
00091 {
00092 if ($doNotTestCacheValidity) {
00093 $this->_log("Zend_Cache_Backend_Xcache::load() : \$doNotTestCacheValidity=true is unsupported by the Xcache backend");
00094 }
00095 $tmp = xcache_get($id);
00096 if (is_array($tmp)) {
00097 return $tmp[0];
00098 }
00099 return false;
00100 }
00101
00108 public function test($id)
00109 {
00110 if (xcache_isset($id)) {
00111 $tmp = xcache_get($id);
00112 if (is_array($tmp)) {
00113 return $tmp[1];
00114 }
00115 }
00116 return false;
00117 }
00118
00131 public function save($data, $id, $tags = array(), $specificLifetime = false)
00132 {
00133 $lifetime = $this->getLifetime($specificLifetime);
00134 $result = xcache_set($id, array($data, time()), $lifetime);
00135 if (count($tags) > 0) {
00136 $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_XCACHE_BACKEND);
00137 }
00138 return $result;
00139 }
00140
00147 public function remove($id)
00148 {
00149 return xcache_unset($id);
00150 }
00151
00167 public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
00168 {
00169 switch ($mode) {
00170 case Zend_Cache::CLEANING_MODE_ALL:
00171
00172 $backup = array();
00173 if (isset($_SERVER['PHP_AUTH_USER'])) {
00174 $backup['PHP_AUTH_USER'] = $_SERVER['PHP_AUTH_USER'];
00175 }
00176 if (isset($_SERVER['PHP_AUTH_PW'])) {
00177 $backup['PHP_AUTH_PW'] = $_SERVER['PHP_AUTH_PW'];
00178 }
00179 if ($this->_options['user']) {
00180 $_SERVER['PHP_AUTH_USER'] = $this->_options['user'];
00181 }
00182 if ($this->_options['password']) {
00183 $_SERVER['PHP_AUTH_PW'] = $this->_options['password'];
00184 }
00185 xcache_clear_cache(XC_TYPE_VAR, 0);
00186 if (isset($backup['PHP_AUTH_USER'])) {
00187 $_SERVER['PHP_AUTH_USER'] = $backup['PHP_AUTH_USER'];
00188 $_SERVER['PHP_AUTH_PW'] = $backup['PHP_AUTH_PW'];
00189 }
00190 return true;
00191 break;
00192 case Zend_Cache::CLEANING_MODE_OLD:
00193 $this->_log("Zend_Cache_Backend_Xcache::clean() : CLEANING_MODE_OLD is unsupported by the Xcache backend");
00194 break;
00195 case Zend_Cache::CLEANING_MODE_MATCHING_TAG:
00196 case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG:
00197 case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG:
00198 $this->_log(self::TAGS_UNSUPPORTED_BY_CLEAN_OF_XCACHE_BACKEND);
00199 break;
00200 default:
00201 Zend_Cache::throwException('Invalid mode for clean() method');
00202 break;
00203 }
00204 }
00205
00211 public function isAutomaticCleaningAvailable()
00212 {
00213 return false;
00214 }
00215
00216 }