Php/Smarty/Redisクラス
提供: 初心者エンジニアの簡易メモ
<?php /** * SmartyRedis * * @ex * require_once 'SmartyRedis.php'; * $redis = new SmartyRedis(); * $redis->connect('localhost', 6379); * $redis->setPrefix('CACHE1'); * $smarty = new Smarty(); * $smarty->caching = 1; * $smarty->cache_handler_func = array($redis, 'cacheHandler'); */ class SmartyRedis { var $_m; function SmartyRedis() { // ref to the redis object $this->_m = new Redis(); } function connect($host, $port) { $this->_m->connect($host, $port); } function setPrefix($prefix) { $this->_m->setOption(Redis::OPT_PREFIX, $prefix); } function cacheHandler($action, &$smarty_obj, &$cache_content, $tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null) { // the key to store cache_ids under, used for clearing $key = 'smarty_caches'; // check redis object if (get_class($this->_m) != 'Redis') { $smarty_obj->trigger_error("redis_cache_handler: \"$this->_m\" is not a redisd object"); return false; } // unique cache id $cache_id = md5($tpl_file . $cache_id . $compile_id); switch ($action) { case 'read': // grab the key from redisd $contents = $this->_m->get($cache_id); // use compression if ($smarty_obj->use_gzip && function_exists("gzuncompress")) { $cache_content = gzuncompress($contents); } else { $cache_content = $contents; } $return = true; break; case 'write': // use compression if ($smarty_obj->use_gzip && function_exists("gzcompress")) { $contents = gzcompress($cache_content); } else { $contents = $cache_content; } // add the cache_id to the $key string $caches = $this->_m->get($key); if (!is_array($caches)) { $caches = array($cache_id); $this->_m->set($key, $caches); } else if (!in_array($cache_id, $caches)) { array_push($caches, $cache_id); $this->_m->set($key, $caches); } // store the value in redisd $stored = $this->_m->set($cache_id, $contents); if (!$stored) { $smarty_obj->trigger_error("redis_cache_handler: set failed."); } $return = true; break; case 'clear': if (empty($cache_id) && empty($compile_id) && empty($tpl_file)) { // get all cache ids $caches = $this->_m->get($key); if (is_array($caches)) { $len = count($caches); for ($i = 0; $i < $len; $i++) { // assume no errors $this->_m->delete($caches[$i]); } // delete the cache ids $this->_m->delete($key); $result = true; } } else { $result = $this->_m->delete($cache_id); } if (!$result) { $smarty_obj->trigger_error("redis_cache_handler: clear query failed."); } $return = true; break; default: // error, unknown action $smarty_obj->trigger_error("redis_cache_handler: unknown action \"$action\""); $return = false; break; } return $return; } }