/** * Test if a cache is available for the given id and (if yes) return it (false else) * * Note : return value is always "string" (unserialization is done by the core not by the backend) * * @param string $id Cache id * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested * @return string|false cached datas */ public function load($id, $doNotTestCacheValidity = false) { self::_validateIdOrTag($id); $res = $this->_fastBackend->load($id, $doNotTestCacheValidity); if ($res === false) { $res = $this->_slowBackend->load($id, $doNotTestCacheValidity); if ($res === false) { // there is no cache at all for this id return false; } } $array = unserialize($res); // maybe, we have to refresh the fast cache ? if ($this->_options['auto_refresh_fast_cache']) { if ($array['priority'] == 10) { // no need to refresh the fast cache with priority = 10 return $array['data']; } $newFastLifetime = $this->_getFastLifetime($array['lifetime'], $array['priority'], time() - $array['expire']); // we have the time to refresh the fast cache $usage = $this->_getFastFillingPercentage('loading'); if ($array['priority'] > 0 && 10 * $array['priority'] >= $usage) { // we can refresh the fast cache $preparedData = $this->_prepareData($array['data'], $array['lifetime'], $array['priority']); $this->_fastBackend->save($preparedData, $id, array(), $newFastLifetime); } } return $array['data']; }
/** * Поддержка мульти-запросов к кешу * Такие запросы поддерживает только memcached, поэтому для остальных типов делаем эмуляцию * * @param array $aName Имя ключа * @return bool|array */ public function multiGet($aName) { if (count($aName) == 0) { return false; } if ($this->sCacheType == SYS_CACHE_TYPE_MEMORY) { $aKeys = array(); $aKv = array(); foreach ($aName as $sName) { $aKeys[] = md5(Config::Get('sys.cache.prefix') . $sName); $aKv[md5(Config::Get('sys.cache.prefix') . $sName)] = $sName; } $data = $this->oBackendCache->load($aKeys); if ($data and is_array($data)) { $aData = array(); foreach ($data as $key => $value) { $aData[$aKv[$key]] = $value; } if (count($aData) > 0) { return $aData; } } return false; } else { $aData = array(); foreach ($aName as $key => $sName) { if (false !== ($data = $this->Get($sName))) { $aData[$sName] = $data; } } if (count($aData) > 0) { return $aData; } return false; } }
/** * Test if a cache is available for the given id and (if yes) return it (false else) * * Note : return value is always "string" (unserialization is done by the core not by the backend) * * @param string $cacheId Cache id * @param boolean $noTestCacheValidity If set to true, the cache validity won't be tested * @return string|false cached datas */ public function load($cacheId, $noTestCacheValidity = false) { return $this->_backend->load($cacheId, $noTestCacheValidity); }