From 297c685f3c4a5e24267fa30f9e8761f0e7599dfd Mon Sep 17 00:00:00 2001 From: xue <> Date: Tue, 21 Feb 2006 19:04:38 +0000 Subject: TAPCCache is formally available. --- framework/Data/TAPCCache.php | 70 ++++++++++++--------------------------- framework/Data/TMemCache.php | 5 +-- framework/Exceptions/messages.txt | 4 +++ 3 files changed, 29 insertions(+), 50 deletions(-) (limited to 'framework') diff --git a/framework/Data/TAPCCache.php b/framework/Data/TAPCCache.php index cef684fb..5c0a6eba 100644 --- a/framework/Data/TAPCCache.php +++ b/framework/Data/TAPCCache.php @@ -18,7 +18,10 @@ * By definition, cache does not ensure the existence of a value * even if it never expires. Cache is not meant to be an persistent storage. * - * To use this module, the APC PHP extension must be loaded. + * To use this module, the APC PHP extension must be loaded and set in the php.ini file the following: + * + * apc.cache_by_default=0 + * * * Some usage examples of TAPCCache are as follows, * @@ -32,7 +35,7 @@ * cache module. It can be accessed via {@link TApplication::getCache()}. * * TAPCCache may be configured in application configuration file as follows - * + * * * @author Alban Hanry * @version $Revision: $ $Date: $ @@ -41,9 +44,6 @@ */ class TAPCCache extends TModule implements ICache { - - const SERIALIZED = "_serialized"; - /** * @var boolean if the module is initialized */ @@ -62,38 +62,12 @@ class TAPCCache extends TModule implements ICache */ public function init($config) { - $application=$this->getApplication(); - if(!$application || $application->getMode()!==TApplication::STATE_PERFORMANCE) - { - if(!extension_loaded('apc')) - throw new TConfigurationException('apccache_extension_required'); - } - if($application) { - if(!$this->_prefix) - $this->_prefix=$application->getUniqueID(); - $application->setCache($this); - } - $this->_initialized=true; - } - - /** - * @return string prefix used to cache key - */ - public function getPrefix() - { - return $this->_prefix; - } - - /** - * @param string prefix to be used for cache key - * @throws TInvalidOperationException if the module is already initialized - */ - public function setPrefix($value) - { - if($this->_initialized) - throw new TInvalidOperationException('apccache_prefix_unchangeable'); - else - $this->_prefix=$value; + if(!extension_loaded('apc')) + throw new TConfigurationException('apccache_extension_required'); + $application=$this->getApplication(); + $this->_prefix=$application->getUniqueID(); + $application->setCache($this); + $this->_initialized=true; } /** @@ -102,7 +76,10 @@ class TAPCCache extends TModule implements ICache */ public function get($key) { - return apc_fetch($this->_prefix.$key); + if(($value=apc_fetch($this->_prefix.$key))!==false) + return Prado::unserialize($value); + else + return $value; } /** @@ -118,41 +95,38 @@ class TAPCCache extends TModule implements ICache */ public function set($key,$value,$expiry=0) { - if(is_array($value)) - $value=new ArrayObject($value); - return apc_store($this->_prefix.$key,$value,$expiry); + return apc_store($this->_prefix.$key,Prado::serialize($value),$expiry); } /** * Stores a value identified by a key into cache if the cache does not contain this key. - * Nothing will be done if the cache already contains the key. + * APC does not support this mode. So calling this method will raise an exception. * @param string the key identifying the value to be cached * @param mixed the value to be cached * @param integer the expiration time of the value, * 0 means never expire, * @return boolean true if the value is successfully stored into cache, false otherwise + * @throw new TNotSupportedException if this method is invoked */ public function add($key,$value,$expiry=0) { - if(!apc_fetch($this->_prefix.$key)) - return $this->set($key,$value,$expiry); - else return false; + throw new TNotSupportedException('apccache_add_unsupported'); } /** * Stores a value identified by a key into cache only if the cache contains this key. * The existing value and expiration time will be overwritten with the new ones. + * APC does not support this mode. So calling this method will raise an exception. * @param string the key identifying the value to be cached * @param mixed the value to be cached * @param integer the expiration time of the value, * 0 means never expire, * @return boolean true if the value is successfully stored into cache, false otherwise + * @throw new TNotSupportedException if this method is invoked */ public function replace($key,$value,$expiry=0) { - if(apc_fetch($this->_prefix.$key)) - return $this->set($key,$value,$expiry); - else return false; + throw new TNotSupportedException('apccache_replace_unsupported'); } /** diff --git a/framework/Data/TMemCache.php b/framework/Data/TMemCache.php index f6ff7da8..b2b1643d 100644 --- a/framework/Data/TMemCache.php +++ b/framework/Data/TMemCache.php @@ -111,9 +111,10 @@ class TMemCache extends TModule implements ICache $this->_cache=new Memcache; if($this->_cache->connect($this->_host,$this->_port)===false) throw new TConfigurationException('memcache_connection_failed',$this->_host,$this->_port); - $this->_prefix=$this->getApplication()->getUniqueID(); + $application=$this->getApplication(); + $this->_prefix=$application->getUniqueID(); + $application->setCache($this); $this->_initialized=true; - $this->getApplication()->setCache($this); } /** diff --git a/framework/Exceptions/messages.txt b/framework/Exceptions/messages.txt index 481bb42d..c142d8a6 100644 --- a/framework/Exceptions/messages.txt +++ b/framework/Exceptions/messages.txt @@ -76,6 +76,10 @@ memcache_connection_failed = TMemCache failed to connect to memcache server % memcache_host_unchangeable = TMemCache.Host cannot be modified after the module is initialized. memcache_port_unchangeable = TMemCache.Port cannot be modified after the module is initialized. +apccache_extension_required = TAPCCache requires APC PHP extension. +apccache_add_unsupported = TAPCCache.add() is not supported. +apccache_replace_unsupported = TAPCCache.replace() is not supported. + errorhandler_errortemplatepath_invalid = TErrorHandler.ErrorTemplatePath '%s' is invalid. Make sure it is in namespace form and points to a valid directory containing error template files. pageservice_page_unknown = Page '%s' Not Found -- cgit v1.2.3