phpbb/phpBB/includes/cache/driver/redis.php
Oleg Pudeyev c852044d6e [ticket/9983] Add redis cache driver tests.
In order to not overwrite data in default redis store, at least
one of redis host or post must be explicitly specified.

Redis cache driver constructor has been modified to accept
host and port as parameters. This was not added to public API
as there are more parameters being passed via global constants.

PHPBB3-9983
2012-12-01 00:48:21 -05:00

165 lines
2.8 KiB
PHP

<?php
/**
*
* @package acm
* @copyright (c) 2011 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
if (!defined('PHPBB_ACM_REDIS_PORT'))
{
define('PHPBB_ACM_REDIS_PORT', 6379);
}
if (!defined('PHPBB_ACM_REDIS_HOST'))
{
define('PHPBB_ACM_REDIS_HOST', 'localhost');
}
/**
* ACM for Redis
*
* Compatible with the php extension phpredis available
* at https://github.com/nicolasff/phpredis
*
* @package acm
*/
class phpbb_cache_driver_redis extends phpbb_cache_driver_memory
{
var $extension = 'redis';
var $redis;
/**
* Creates a redis cache driver.
*
* The following global constants affect operation:
*
* PHPBB_ACM_REDIS_HOST
* PHPBB_ACM_REDIS_PORT
* PHPBB_ACM_REDIS_PASSWORD
* PHPBB_ACM_REDIS_DB
*
* There are no publicly documented constructor parameters.
*/
function __construct()
{
// Call the parent constructor
parent::__construct();
$this->redis = new Redis();
$args = func_get_args();
if (!empty($args))
{
$ok = call_user_func_array(array($this->redis, 'connect'), $args);
}
else
{
$ok = $this->redis->connect(PHPBB_ACM_REDIS_HOST, PHPBB_ACM_REDIS_PORT);
}
if (!$ok)
{
trigger_error('Could not connect to redis server');
}
if (defined('PHPBB_ACM_REDIS_PASSWORD'))
{
if (!$this->redis->auth(PHPBB_ACM_REDIS_PASSWORD))
{
global $acm_type;
trigger_error("Incorrect password for the ACM module $acm_type.", E_USER_ERROR);
}
}
$this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
$this->redis->setOption(Redis::OPT_PREFIX, $this->key_prefix);
if (defined('PHPBB_ACM_REDIS_DB'))
{
if (!$this->redis->select(PHPBB_ACM_REDIS_DB))
{
global $acm_type;
trigger_error("Incorrect database for the ACM module $acm_type.", E_USER_ERROR);
}
}
}
/**
* Unload the cache resources
*
* @return null
*/
function unload()
{
parent::unload();
$this->redis->close();
}
/**
* Purge cache data
*
* @return null
*/
function purge()
{
$this->redis->flushDB();
parent::purge();
}
/**
* Fetch an item from the cache
*
* @access protected
* @param string $var Cache key
* @return mixed Cached data
*/
function _read($var)
{
return $this->redis->get($var);
}
/**
* Store data in the cache
*
* @access protected
* @param string $var Cache key
* @param mixed $data Data to store
* @param int $ttl Time-to-live of cached data
* @return bool True if the operation succeeded
*/
function _write($var, $data, $ttl = 2592000)
{
return $this->redis->setex($var, $ttl, $data);
}
/**
* Remove an item from the cache
*
* @access protected
* @param string $var Cache key
* @return bool True if the operation succeeded
*/
function _delete($var)
{
if ($this->redis->delete($var) > 0)
{
return true;
}
return false;
}
}