123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- <?php
- /*
- * This file is part of the symfony package.
- * (c) 2004-2006 Fabien Potencier <fabien.potencier@symfony-project.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Cache class that stores cached content in memcache.
- *
- * @package symfony
- * @subpackage cache
- * @author Fabien Potencier <fabien.potencier@symfony-project.com>
- * @version SVN: $Id: sfMemcacheCache.class.php 9802 2008-06-23 15:16:57Z fabien $
- */
- class sfMemcacheCache extends sfCache
- {
- protected
- $memcache = null;
- /**
- * Initializes this sfCache instance.
- *
- * Available options:
- *
- * * memcache: A memcache object (optional)
- *
- * * host: The default host (default to localhost)
- * * port: The port for the default server (default to 11211)
- * * persistent: true if the connection must be persistent, false otherwise (true by default)
- *
- * * servers: An array of additional servers (keys: host, port, persistent)
- *
- * * see sfCache for options available for all drivers
- *
- * @see sfCache
- */
- public function initialize($options = array())
- {
- parent::initialize($options);
- if (!class_exists('Memcache'))
- {
- throw new sfInitializationException('You must have memcache installed and enabled to use sfMemcacheCache class.');
- }
- if ($this->getOption('memcache'))
- {
- $this->memcache = $this->getOption('memcache');
- }
- else
- {
- $this->memcache = new Memcache();
- if ($this->getOption('servers'))
- {
- foreach ($this->getOption('servers') as $server)
- {
- $port = isset($server['port']) ? $server['port'] : 11211;
- if (!$this->memcache->addServer($server['host'], $port, isset($server['persistent']) ? $server['persistent'] : true))
- {
- throw new sfInitializationException(sprintf('Unable to connect to the memcache server (%s:%s).', $server['host'], $port));
- }
- }
- }
- else
- {
- $method = $this->getOption('persistent', true) ? 'pconnect' : 'connect';
- if (!$this->memcache->$method($this->getOption('host', 'localhost'), $this->getOption('port', 11211), $this->getOption('timeout', 1)))
- {
- throw new sfInitializationException(sprintf('Unable to connect to the memcache server (%s:%s).', $this->getOption('host', 'localhost'), $this->getOption('port', 11211)));
- }
- }
- }
- }
- /**
- * @see sfCache
- */
- public function getBackend()
- {
- return $this->memcache;
- }
- /**
- * @see sfCache
- */
- public function get($key, $default = null)
- {
- $value = $this->memcache->get($this->getOption('prefix').$key);
- return false === $value ? $default : $value;
- }
- /**
- * @see sfCache
- */
- public function has($key)
- {
- return !(false === $this->memcache->get($this->getOption('prefix').$key));
- }
- /**
- * @see sfCache
- */
- public function set($key, $data, $lifetime = null)
- {
- $lifetime = is_null($lifetime) ? $this->getOption('lifetime') : $lifetime;
- // save metadata
- $this->setMetadata($key, $lifetime);
- // save key for removePattern()
- if ($this->getOption('storeCacheInfo', false))
- {
- $this->setCacheInfo($key);
- }
- return $this->memcache->set($this->getOption('prefix').$key, $data, false, $lifetime);
- }
- /**
- * @see sfCache
- */
- public function remove($key)
- {
- $this->memcache->delete($this->getOption('prefix').'_metadata'.self::SEPARATOR.$key);
- return $this->memcache->delete($this->getOption('prefix').$key);
- }
- /**
- * @see sfCache
- */
- public function clean($mode = sfCache::ALL)
- {
- if (sfCache::ALL === $mode)
- {
- return $this->memcache->flush();
- }
- }
- /**
- * @see sfCache
- */
- public function getLastModified($key)
- {
- if (false === ($retval = $this->getMetadata($key)))
- {
- return 0;
- }
- return $retval['lastModified'];
- }
- /**
- * @see sfCache
- */
- public function getTimeout($key)
- {
- if (false === ($retval = $this->getMetadata($key)))
- {
- return 0;
- }
- return $retval['timeout'];
- }
- /**
- * @see sfCache
- */
- public function removePattern($pattern)
- {
- if (!$this->getOption('storeCacheInfo', false))
- {
- throw new sfCacheException('To use the "removePattern" method, you must set the "storeCacheInfo" option to "true".');
- }
- $regexp = self::patternToRegexp($this->getOption('prefix').$pattern);
- foreach ($this->getCacheInfo() as $key)
- {
- if (preg_match($regexp, $key))
- {
- $this->memcache->delete($key);
- }
- }
- }
- /**
- * @see sfCache
- */
- public function getMany($keys)
- {
- $values = array();
- foreach ($this->memcache->get(array_map(create_function('$k', 'return "'.$this->getOption('prefix').'".$k;'), $keys)) as $key => $value)
- {
- $values[str_replace($this->getOption('prefix'), '', $key)] = $value;
- }
- return $values;
- }
- /**
- * Gets metadata about a key in the cache.
- *
- * @param string $key A cache key
- *
- * @return array An array of metadata information
- */
- protected function getMetadata($key)
- {
- return $this->memcache->get($this->getOption('prefix').'_metadata'.self::SEPARATOR.$key);
- }
- /**
- * Stores metadata about a key in the cache.
- *
- * @param string $key A cache key
- * @param string $key The lifetime
- */
- protected function setMetadata($key, $lifetime)
- {
- $this->memcache->set($this->getOption('prefix').'_metadata'.self::SEPARATOR.$key, array('lastModified' => time(), 'timeout' => time() + $lifetime), false, $lifetime);
- }
- /**
- * Updates the cache information for the given cache key.
- *
- * @param string $key The cache key
- */
- protected function setCacheInfo($key)
- {
- $keys = $this->memcache->get($this->getOption('prefix').'_metadata');
- if (!is_array($keys))
- {
- $keys = array();
- }
- $keys[] = $this->getOption('prefix').$key;
- $this->memcache->set($this->getOption('prefix').'_metadata', $keys, 0);
- }
- /**
- * Gets cache information.
- */
- protected function getCacheInfo()
- {
- $keys = $this->memcache->get($this->getOption('prefix').'_metadata');
- if (!is_array($keys))
- {
- return array();
- }
- return $keys;
- }
- }
|