Merge pull request #260 from kijin/pr/misc-optimizations

여러 가지 자잘한 기능 정리 및 캐시 설정 개선
This commit is contained in:
Kijin Sung 2016-02-11 14:51:03 +09:00
commit 94cd5570b0
19 changed files with 292 additions and 463 deletions

View file

@ -8,17 +8,22 @@
*/
class CacheHandler extends Handler
{
/**
* Instances are stored here.
*/
protected static $_instances = array();
/**
* instance of cache handler
* @var CacheBase
*/
var $handler = null;
protected $handler = null;
/**
* Version of key group
* @var int
*/
var $keyGroupVersions = null;
protected $keyGroupVersions = null;
/**
* Get a instance of CacheHandler(for singleton)
@ -28,14 +33,14 @@ class CacheHandler extends Handler
* @param boolean $always_use_file If set true, use a file cache always
* @return CacheHandler
*/
function getInstance($target = 'object', $info = null, $always_use_file = false)
public static function getInstance($target = 'object', $info = null, $always_use_file = false)
{
$cache_handler_key = $target . ($always_use_file ? '_file' : '');
if(!$GLOBALS['__XE_CACHE_HANDLER__'][$cache_handler_key])
$key = 'object' . ($always_use_file ? '_file' : '');
if (!isset(self::$_instances[$key]))
{
$GLOBALS['__XE_CACHE_HANDLER__'][$cache_handler_key] = new CacheHandler($target, $info, $always_use_file);
self::$_instances[$key] = new self($target, $info, $always_use_file);
}
return $GLOBALS['__XE_CACHE_HANDLER__'][$cache_handler_key];
return self::$_instances[$key];
}
/**
@ -44,84 +49,53 @@ class CacheHandler extends Handler
* Do not use this directly. You can use getInstance() instead.
*
* @see CacheHandler::getInstance
* @param string $target type of cache (object|template)
* @param string $target type of cache (object)
* @param object $info info. of DB
* @param boolean $always_use_file If set true, use a file cache always
* @return CacheHandler
*/
function __construct($target, $info = null, $always_use_file = false)
protected function __construct($target, $info = null, $always_use_file = false)
{
if(!$info)
// Allow using custom cache info for backward compatibility.
if (is_object($info) && $info->use_object_cache)
{
$info = Context::getDBInfo();
$cache_config = $info->use_object_cache;
}
if($info)
else
{
if($target == 'object')
$cache_config = config('cache');
if (is_array($cache_config) && count($cache_config))
{
if($info->use_object_cache == 'apc')
{
$type = 'apc';
}
else if(substr($info->use_object_cache, 0, 8) == 'memcache')
{
$type = 'memcache';
$url = $info->use_object_cache;
}
else if(substr($info->use_object_cache, 0, 5) == 'redis')
{
$type = 'redis';
$url = $info->use_object_cache;
}
else if($info->use_object_cache == 'wincache')
{
$type = 'wincache';
}
else if($info->use_object_cache == 'file')
{
$type = 'file';
}
else if($always_use_file)
{
$type = 'file';
}
}
else if($target == 'template')
{
if($info->use_template_cache == 'apc')
{
$type = 'apc';
}
else if(substr($info->use_template_cache, 0, 8) == 'memcache')
{
$type = 'memcache';
$url = $info->use_template_cache;
}
else if(substr($info->use_template_cache, 0, 5) == 'redis')
{
$type = 'redis';
$url = $info->use_template_cache;
}
else if($info->use_template_cache == 'wincache')
{
$type = 'wincache';
}
}
if($type)
{
$class = 'Cache' . ucfirst($type);
include_once sprintf('%sclasses/cache/%s.class.php', _XE_PATH_, $class);
$this->handler = call_user_func(array($class, 'getInstance'), $url);
$this->keyGroupVersions = $this->handler->get('key_group_versions', 0);
if(!$this->keyGroupVersions)
{
$this->keyGroupVersions = array();
$this->handler->put('key_group_versions', $this->keyGroupVersions, 0);
}
$cache_config = array_first($cache_config);
}
}
// Handle various types of cache backend.
if (preg_match('/^(apc|memcache|redis|wincache|file)/', strval($cache_config), $matches))
{
$type = $matches[1];
}
elseif ($always_use_file)
{
$type = 'file';
}
else
{
return;
}
// Create an instance of cache backend.
$class = 'Cache' . ucfirst($type);
include_once sprintf('%sclasses/cache/%s.class.php', _XE_PATH_, $class);
$this->handler = $class::getInstance($cache_config);
// Initialize key group versions.
$this->keyGroupVersions = $this->handler->get('key_group_versions', 0);
if(!$this->keyGroupVersions)
{
$this->keyGroupVersions = array();
$this->handler->put('key_group_versions', $this->keyGroupVersions, 0);
}
}
/**
@ -129,14 +103,19 @@ class CacheHandler extends Handler
*
* @return boolean
*/
function isSupport()
public function isSupport($type = null, $cache_config = null)
{
if($this->handler && $this->handler->isSupport())
if ($type === null)
{
return true;
return ($this->handler && $this->handler->isSupport());
}
else
{
$class = 'Cache' . ucfirst(str_replace('memcached', 'memcache', $type));
include_once sprintf('%sclasses/cache/%s.class.php', _XE_PATH_, $class);
$handler = $class::getInstance($cache_config, true);
return $handler->isSupport();
}
return false;
}
/**
@ -145,11 +124,9 @@ class CacheHandler extends Handler
* @param string $key The key that will be associated with the item.
* @return string Returns cache name
*/
function getCacheKey($key)
public function getCacheKey($key)
{
$key = str_replace('/', ':', $key);
return __XE_VERSION__ . ':' . $key;
return RX_VERSION . ':' . str_replace('/', ':', $key);
}
/**
@ -160,16 +137,10 @@ class CacheHandler extends Handler
* If stored time is older then modified time, return false.
* @return false|mixed Return false on failure or older then modified time. Return the string associated with the $key on success.
*/
function get($key, $modified_time = 0)
public function get($key, $modified_time = 0)
{
if(!$this->handler)
{
return false;
}
$key = $this->getCacheKey($key);
return $this->handler->get($key, $modified_time);
if (!$key) return false;
return $this->handler ? $this->handler->get($this->getCacheKey($key), $modified_time) : false;
}
/**
@ -182,16 +153,10 @@ class CacheHandler extends Handler
* If no ttl is supplied, use the default valid time.
* @return bool|void Returns true on success or false on failure. If use CacheFile, returns void.
*/
function put($key, $obj, $valid_time = 0)
public function put($key, $obj, $valid_time = 0)
{
if(!$this->handler && !$key)
{
return false;
}
$key = $this->getCacheKey($key);
return $this->handler->put($key, $obj, $valid_time);
if (!$key) return false;
return $this->handler ? $this->handler->put($this->getCacheKey($key), $obj, $valid_time) : false;
}
/**
@ -200,16 +165,10 @@ class CacheHandler extends Handler
* @param string $key Cache key
* @return void
*/
function delete($key)
public function delete($key)
{
if(!$this->handler)
{
return false;
}
$key = $this->getCacheKey($key);
return $this->handler->delete($key);
if (!$key) return false;
return $this->handler ? $this->handler->delete($this->getCacheKey($key)) : false;
}
/**
@ -220,16 +179,10 @@ class CacheHandler extends Handler
* If stored time is older then modified time, the data is invalid.
* @return bool Return true on valid or false on invalid.
*/
function isValid($key, $modified_time)
public function isValid($key, $modified_time = 0)
{
if(!$this->handler)
{
return false;
}
$key = $this->getCacheKey($key);
return $this->handler->isValid($key, $modified_time);
if (!$key) return false;
return $this->handler ? $this->handler->isValid($this->getCacheKey($key), $modified_time) : false;
}
/**
@ -237,14 +190,9 @@ class CacheHandler extends Handler
*
* @return bool|void Returns true on success or false on failure. If use CacheFile, returns void.
*/
function truncate()
public function truncate()
{
if(!$this->handler)
{
return false;
}
return $this->handler->truncate();
return $this->handler ? $this->handler->truncate() : false;
}
/**
@ -263,7 +211,7 @@ class CacheHandler extends Handler
* @param string $key Cache key
* @return string
*/
function getGroupKey($keyGroupName, $key)
public function getGroupKey($keyGroupName, $key)
{
if(!$this->keyGroupVersions[$keyGroupName])
{
@ -280,12 +228,11 @@ class CacheHandler extends Handler
* @param string $keyGroupName Group name
* @return void
*/
function invalidateGroupKey($keyGroupName)
public function invalidateGroupKey($keyGroupName)
{
$this->keyGroupVersions[$keyGroupName]++;
$this->handler->put('key_group_versions', $this->keyGroupVersions, 0);
}
}
/**
@ -299,7 +246,7 @@ class CacheBase
* Default valid time
* @var int
*/
var $valid_time = 36000;
public $valid_time = 36000;
/**
* Get cached data
@ -309,7 +256,7 @@ class CacheBase
* If stored time is older then modified time, return false.
* @return false|mixed Return false on failure or older then modified time. Return the string associated with the $key on success.
*/
function get($key, $modified_time = 0)
public function get($key, $modified_time = 0)
{
return false;
}
@ -324,10 +271,18 @@ class CacheBase
* If no ttl is supplied, use the default valid time.
* @return bool|void Returns true on success or false on failure. If use CacheFile, returns void.
*/
function put($key, $obj, $valid_time = 0)
public function put($key, $obj, $valid_time = 0)
{
return false;
}
/**
* Alias of put()
*/
public function set($key, $obj, $valid_time = 0)
{
return $this->put($key, $obj, $valid_time = 0);
}
/**
* Return whether cache is valid or invalid
@ -337,7 +292,7 @@ class CacheBase
* If stored time is older then modified time, the data is invalid.
* @return bool Return true on valid or false on invalid.
*/
function isValid($key, $modified_time = 0)
public function isValid($key, $modified_time = 0)
{
return false;
}
@ -347,7 +302,7 @@ class CacheBase
*
* @return boolean
*/
function isSupport()
public function isSupport()
{
return false;
}
@ -357,7 +312,7 @@ class CacheBase
*
* @return bool|void Returns true on success or false on failure. If use CacheFile, returns void.
*/
function truncate()
public function truncate()
{
return false;
}

View file

@ -21,11 +21,12 @@ class CacheMemcache extends CacheBase
* @param string $url url of memcache
* @return CacheMemcache instance of CacheMemcache
*/
function getInstance($url)
function getInstance($url, $force_new_instance = false)
{
if(!$GLOBALS['__CacheMemcache__'])
if(!$GLOBALS['__CacheMemcache__'] || $force_new_instance)
{
$GLOBALS['__CacheMemcache__'] = new CacheMemcache($url);
unset($GLOBALS['XE_MEMCACHE_SUPPORT']);
}
return $GLOBALS['__CacheMemcache__'];
}

View file

@ -21,9 +21,9 @@ class CacheRedis extends CacheBase
* @param string $url url of Redis
* @return CacheRedis instance of CacheRedis
*/
function getInstance($url)
function getInstance($url, $force_new_instance = false)
{
if(!$GLOBALS['__CacheRedis__'])
if(!$GLOBALS['__CacheRedis__'] || $force_new_instance)
{
$GLOBALS['__CacheRedis__'] = new CacheRedis($url);
}

View file

@ -22,24 +22,18 @@ class DB
* priority of DBMS
* @var array
*/
var $priority_dbms = array(
protected static $priority_dbms = array(
'mysqli' => 6,
'mysql' => 4,
'cubrid' => 2,
'mssql' => 1
);
/**
* count cache path
* @var string
*/
var $count_cache_path = 'files/cache/db';
/**
* operations for condition
* @var array
*/
var $cond_operation = array(
protected static $cond_operation = array(
'equal' => '=',
'more' => '>=',
'excess' => '>',
@ -54,83 +48,83 @@ class DB
* master database connection string
* @var array
*/
var $master_db = NULL;
protected $master_db = NULL;
/**
* array of slave databases connection strings
* @var array
*/
var $slave_db = NULL;
var $result = NULL;
protected $slave_db = NULL;
protected $result = NULL;
/**
* error code (0 means no error)
* @var int
*/
var $errno = 0;
protected $errno = 0;
/**
* error message
* @var string
*/
var $errstr = '';
protected $errstr = '';
/**
* query string of latest executed query
* @var string
*/
var $query = '';
var $connection = '';
protected $query = '';
protected $connection = '';
/**
* elapsed time of latest executed query
* @var int
*/
var $elapsed_time = 0;
protected $elapsed_time = 0;
/**
* elapsed time of latest executed DB class
* @var int
*/
var $elapsed_dbclass_time = 0;
protected $elapsed_dbclass_time = 0;
/**
* transaction flag
* @var boolean
*/
var $transaction_started = FALSE;
var $is_connected = FALSE;
protected $transaction_started = FALSE;
protected $is_connected = FALSE;
/**
* returns enable list in supported dbms list
* will be written by classes/DB/DB***.class.php
* @var array
*/
var $supported_list = array();
protected static $supported_list = array();
/**
* location of query cache
* @var string
*/
var $cache_file = 'files/cache/queries/';
protected $cache_file = 'files/cache/queries/';
/**
* stores database type: 'mysql','cubrid','mssql' etc. or 'db' when database is not yet set
* @var string
*/
var $db_type;
public $db_type;
/**
* flag to decide if class prepared statements or not (when supported); can be changed from db.config.info
* @var string
*/
var $use_prepared_statements;
public $use_prepared_statements;
/**
* leve of transaction
* @var unknown
*/
private $transactionNestedLevel = 0;
protected $transactionNestedLevel = 0;
/**
* returns instance of certain db type
@ -189,7 +183,6 @@ class DB
*/
public function __construct()
{
$this->count_cache_path = _XE_PATH_ . $this->count_cache_path;
$this->cache_file = _XE_PATH_ . $this->cache_file;
}
@ -199,10 +192,9 @@ class DB
* check by instance can creatable
* @return array return supported DBMS list
*/
function getSupportedList()
public static function getSupportedList()
{
$oDB = new DB();
return $oDB->_getSupportedList();
return self::_getSupportedList();
}
/**
@ -210,20 +202,18 @@ class DB
* this list return by child class
* @return array return enable DBMS list in supported dbms list
*/
function getEnableList()
public static function getEnableList()
{
is_a($this, 'DB') ? $self = $this : $self = self::getInstance();
if(!$self->supported_list)
if(!self::$supported_list)
{
$oDB = new DB();
$self->supported_list = $oDB->_getSupportedList();
self::$supported_list = self::_getSupportedList();
}
$enableList = array();
if(is_array($self->supported_list))
if(is_array(self::$supported_list))
{
foreach($self->supported_list AS $key => $value)
foreach(self::$supported_list AS $key => $value)
{
if($value->enable)
{
@ -239,20 +229,18 @@ class DB
* this list return by child class
* @return array return disable DBMS list in supported dbms list
*/
function getDisableList()
public static function getDisableList()
{
is_a($this, 'DB') ? $self = $this : $self = self::getInstance();
if(!$self->supported_list)
if(!self::$supported_list)
{
$oDB = new DB();
$self->supported_list = $oDB->_getSupportedList();
self::$supported_list = self::_getSupportedList();
}
$disableList = array();
if(is_array($self->supported_list))
if(is_array(self::$supported_list))
{
foreach($self->supported_list AS $key => $value)
foreach(self::$supported_list AS $key => $value)
{
if(!$value->enable)
{
@ -265,17 +253,16 @@ class DB
/**
* returns list of supported dbms list
* this method is private
*
* @return array return supported DBMS list
*/
function _getSupportedList()
protected static function _getSupportedList()
{
static $get_supported_list = '';
if(is_array($get_supported_list))
if(self::$supported_list)
{
$this->supported_list = $get_supported_list;
return $this->supported_list;
return self::$supported_list;
}
$get_supported_list = array();
$db_classes_path = _XE_PATH_ . "classes/db/";
$filter = "/^DB([^\.]+)\.class\.php/i";
@ -303,41 +290,13 @@ class DB
}
// sort
@usort($get_supported_list, array($this, '_sortDBMS'));
usort($get_supported_list, function($a, $b) {
$priority_a = isset(self::$priority_dbms[$a->db_type]) ? self::$priority_dbms[$a->db_type] : 0;
$priority_b = isset(self::$priority_dbms[$b->db_type]) ? self::$priority_dbms[$b->db_type] : 0;
return $a - $b;
});
$this->supported_list = $get_supported_list;
return $this->supported_list;
}
/**
* sort dbms as priority
*/
function _sortDBMS($a, $b)
{
if(!isset($this->priority_dbms[$a->db_type]))
{
$priority_a = 0;
}
else
{
$priority_a = $this->priority_dbms[$a->db_type];
}
if(!isset($this->priority_dbms[$b->db_type]))
{
$priority_b = 0;
}
else
{
$priority_b = $this->priority_dbms[$b->db_type];
}
if($priority_a == $priority_b)
{
return 0;
}
return ($priority_a > $priority_b) ? -1 : 1;
return self::$supported_list = $get_supported_list;
}
/**
@ -345,7 +304,7 @@ class DB
* The value is set in the child class
* @return boolean true: is supported, false: is not supported
*/
function isSupported()
public function isSupported()
{
return self::$isSupported;
}
@ -356,7 +315,7 @@ class DB
* @param int $indx key of server list
* @return boolean true: connected, false: not connected
*/
function isConnected($type = 'master', $indx = 0)
public function isConnected($type = 'master', $indx = 0)
{
if($type == 'master')
{
@ -373,7 +332,7 @@ class DB
* @param string $query query string
* @return void
*/
function actStart($query)
public function actStart($query)
{
$this->setError(0, 'success');
$this->query = $query;
@ -385,7 +344,7 @@ class DB
* finish recording log
* @return void
*/
function actFinish()
public function actFinish()
{
if(!$this->query)
{
@ -461,7 +420,7 @@ class DB
* @param array $log values set query debug
* @return void
*/
function setQueryLog($log)
public function setQueryLog($log)
{
$GLOBALS['__db_queries__'][] = $log;
}
@ -472,7 +431,7 @@ class DB
* @param string $errstr error message
* @return void
*/
function setError($errno = 0, $errstr = 'success')
public function setError($errno = 0, $errstr = 'success')
{
$this->errno = $errno;
$this->errstr = $errstr;
@ -482,7 +441,7 @@ class DB
* Return error status
* @return boolean true: error, false: no error
*/
function isError()
public function isError()
{
return ($this->errno !== 0);
}
@ -491,7 +450,7 @@ class DB
* Returns object of error info
* @return object object of error
*/
function getError()
public function getError()
{
$this->errstr = Context::convertEncodingStr($this->errstr);
return new Object($this->errno, $this->errstr);
@ -505,7 +464,7 @@ class DB
* @param array $arg_columns column list. if you want get specific colums from executed result, add column list to $arg_columns
* @return object result of query
*/
function executeQuery($query_id, $args = NULL, $arg_columns = NULL, $type = NULL)
public function executeQuery($query_id, $args = NULL, $arg_columns = NULL, $type = NULL)
{
static $cache_file = array();
@ -572,7 +531,7 @@ class DB
* @param string $xml_file original xml query file
* @return string cache file
*/
function checkQueryCacheFile($query_id, $xml_file)
public function checkQueryCacheFile($query_id, $xml_file)
{
// first try finding cache file
$cache_file = sprintf('%s%s%s.%s.%s.cache.php', _XE_PATH_, $this->cache_file, $query_id, __ZBXE_VERSION__, $this->db_type);
@ -601,7 +560,7 @@ class DB
* @param array $arg_columns column list. if you want get specific colums from executed result, add column list to $arg_columns
* @return object result of query
*/
function _executeQuery($cache_file, $source_args, $query_id, $arg_columns, $type)
public function _executeQuery($cache_file, $source_args, $query_id, $arg_columns, $type)
{
global $lang;
@ -619,7 +578,7 @@ class DB
$output = include($cache_file);
if((is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool())
if($output instanceof Object && !$output->toBool())
{
return $output;
}
@ -652,7 +611,7 @@ class DB
{
$output = $this->getError();
}
else if(!is_a($output, 'Object') && !is_subclass_of($output, 'Object'))
elseif(!($output instanceof Object))
{
$output = new Object();
}
@ -668,57 +627,9 @@ class DB
* @param string $condition condition to get data
* @return int count of cache data
*/
function getCountCache($tables, $condition)
public function getCountCache($tables, $condition)
{
return FALSE;
/*
if(!$tables)
{
return FALSE;
}
if(!is_dir($this->count_cache_path))
{
return FileHandler::makeDir($this->count_cache_path);
}
$condition = md5($condition);
if(!is_array($tables))
{
$tables_str = $tables;
}
else
{
$tables_str = implode('.', $tables);
}
$cache_path = sprintf('%s/%s%s', $this->count_cache_path, $this->prefix, $tables_str);
FileHandler::makeDir($cache_path);
$cache_filename = sprintf('%s/%s.%s', $cache_path, $tables_str, $condition);
if(!file_exists($cache_filename))
{
return FALSE;
}
$cache_mtime = filemtime($cache_filename);
if(!is_array($tables))
{
$tables = array($tables);
}
foreach($tables as $alias => $table)
{
$table_filename = sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table);
if(!file_exists($table_filename) || filemtime($table_filename) > $cache_mtime)
{
return FALSE;
}
}
$count = (int) FileHandler::readFile($cache_filename);
return $count;
*/
}
/**
@ -728,37 +639,9 @@ class DB
* @param int $count count of cache data to save
* @return void
*/
function putCountCache($tables, $condition, $count = 0)
public function putCountCache($tables, $condition, $count = 0)
{
return FALSE;
/*
if(!$tables)
{
return FALSE;
}
if(!is_dir($this->count_cache_path))
{
return FileHandler::makeDir($this->count_cache_path);
}
$condition = md5($condition);
if(!is_array($tables))
{
$tables_str = $tables;
}
else
{
$tables_str = implode('.', $tables);
}
$cache_path = sprintf('%s/%s%s', $this->count_cache_path, $this->prefix, $tables_str);
FileHandler::makeDir($cache_path);
$cache_filename = sprintf('%s/%s.%s', $cache_path, $tables_str, $condition);
FileHandler::writeFile($cache_filename, $count);
*/
}
/**
@ -766,29 +649,9 @@ class DB
* @param array|string $tables tables to reset cache data
* @return boolean true: success, false: failed
*/
function resetCountCache($tables)
public function resetCountCache($tables)
{
return FALSE;
/*
if(!$tables)
{
return FALSE;
}
return FileHandler::makeDir($this->count_cache_path);
if(!is_array($tables))
{
$tables = array($tables);
}
foreach($tables as $alias => $table)
{
$filename = sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table);
FileHandler::removeFile($filename);
FileHandler::writeFile($filename, '');
}
return TRUE;
*/
}
/**
@ -796,7 +659,7 @@ class DB
* @param string $table_name
* @return void
*/
function dropTable($table_name)
public function dropTable($table_name)
{
if(!$table_name)
{
@ -812,7 +675,7 @@ class DB
* @param boolean $with_values
* @return string
*/
function getSelectSql($query, $with_values = TRUE)
public function getSelectSql($query, $with_values = TRUE)
{
$select = $query->getSelectString($with_values);
if($select == '')
@ -881,7 +744,7 @@ class DB
*
* @param $queryObject
*/
function getClickCountQuery($queryObject)
public function getClickCountQuery($queryObject)
{
$new_update_columns = array();
$click_count_columns = $queryObject->getClickCountColumns();
@ -907,7 +770,7 @@ class DB
* @param boolean $with_priority
* @return string
*/
function getDeleteSql($query, $with_values = TRUE, $with_priority = FALSE)
public function getDeleteSql($query, $with_values = TRUE, $with_priority = FALSE)
{
$sql = 'DELETE ';
@ -939,7 +802,7 @@ class DB
* @param boolean $with_priority
* @return string
*/
function getUpdateSql($query, $with_values = TRUE, $with_priority = FALSE)
public function getUpdateSql($query, $with_values = TRUE, $with_priority = FALSE)
{
$columnsList = $query->getUpdateString($with_values);
if($columnsList == '')
@ -971,7 +834,7 @@ class DB
* @param boolean $with_priority
* @return string
*/
function getInsertSql($query, $with_values = TRUE, $with_priority = FALSE)
public function getInsertSql($query, $with_values = TRUE, $with_priority = FALSE)
{
$tableName = $query->getFirstTableName();
$values = $query->getInsertString($with_values);
@ -984,7 +847,7 @@ class DB
* Return index from slave server list
* @return int
*/
function _getSlaveConnectionStringIndex()
public function _getSlaveConnectionStringIndex()
{
$max = count($this->slave_db);
$indx = rand(0, $max - 1);
@ -997,7 +860,7 @@ class DB
* @param int $indx if indx value is NULL, return rand number in slave server list
* @return resource
*/
function _getConnection($type = 'master', $indx = NULL)
public function _getConnection($type = 'master', $indx = NULL)
{
if($type == 'master' || $this->transactionNestedLevel)
{
@ -1036,26 +899,18 @@ class DB
* check db information exists
* @return boolean
*/
function _dbInfoExists()
public function _dbInfoExists()
{
if(!$this->master_db)
{
return FALSE;
}
if(count($this->slave_db) === 0)
{
return FALSE;
}
return TRUE;
return ($this->master_db && count($this->slave_db));
}
/**
* DB disconnection
* this method is protected
*
* @param resource $connection
* @return void
*/
function _close($connection)
protected function _close($connection)
{
}
@ -1066,7 +921,7 @@ class DB
* @param int $indx number in slave dbms server list
* @return void
*/
function close($type = 'master', $indx = 0)
public function close($type = 'master', $indx = 0)
{
if(!$this->isConnected($type, $indx))
{
@ -1093,7 +948,7 @@ class DB
* this method is protected
* @return boolean
*/
function _begin($transactionLevel = 0)
protected function _begin($transactionLevel = 0)
{
return TRUE;
}
@ -1102,7 +957,7 @@ class DB
* DB transaction start
* @return void
*/
function begin()
public function begin()
{
if(!$this->isConnected())
{
@ -1121,7 +976,7 @@ class DB
* this method is protected
* @return boolean
*/
function _rollback($transactionLevel = 0)
protected function _rollback($transactionLevel = 0)
{
return TRUE;
}
@ -1130,7 +985,7 @@ class DB
* DB transaction rollback
* @return void
*/
function rollback()
public function rollback()
{
if(!$this->isConnected() || !$this->transaction_started)
{
@ -1152,7 +1007,7 @@ class DB
* this method is protected
* @return boolean
*/
function _commit()
protected function _commit()
{
return TRUE;
}
@ -1162,7 +1017,7 @@ class DB
* @param boolean $force regardless transaction start status or connect status, forced to commit
* @return void
*/
function commit($force = FALSE)
public function commit($force = FALSE)
{
if(!$force && (!$this->isConnected() || !$this->transaction_started))
{
@ -1186,19 +1041,19 @@ class DB
* @param resource $connection
* @return void
*/
function __query($query, $connection)
protected function __query($query, $connection)
{
}
/**
* Execute the query
* this method is protected
*
* @param string $query
* @param resource $connection
* @return resource
*/
function _query($query, $connection = NULL)
public function _query($query, $connection = NULL)
{
if($connection == NULL)
{
@ -1221,7 +1076,7 @@ class DB
* this method is protected
* @return void
*/
function _setDBInfo()
protected function _setDBInfo()
{
$db_info = config('db');
$this->master_db = $db_info['master'];
@ -1236,7 +1091,7 @@ class DB
* @param array $connection
* @return void
*/
function __connect($connection)
protected function __connect($connection)
{
}
@ -1247,7 +1102,7 @@ class DB
* @param resource $connection
* @return void
*/
function _afterConnect($connection)
protected function _afterConnect($connection)
{
}
@ -1259,7 +1114,7 @@ class DB
* @param int $indx number in slave dbms server list
* @return void
*/
function _connect($type = 'master', $indx = 0)
protected function _connect($type = 'master', $indx = 0)
{
if($this->isConnected($type, $indx))
{
@ -1305,7 +1160,7 @@ class DB
* Start recording DBClass log
* @return void
*/
function actDBClassStart()
public function actDBClassStart()
{
$this->setError(0, 'success');
$this->act_dbclass_start = microtime(true);
@ -1316,7 +1171,7 @@ class DB
* Finish recording DBClass log
* @return void
*/
function actDBClassFinish()
public function actDBClassFinish()
{
if(!$this->query)
{
@ -1338,7 +1193,7 @@ class DB
* @param boolean $force force load DBParser instance
* @return DBParser
*/
function getParser($force = FALSE)
public function getParser($force = FALSE)
{
static $dbParser = NULL;
if(!$dbParser || $force)

View file

@ -107,12 +107,6 @@ class DBCubrid extends DB
*/
function addQuotes($string)
{
if(version_compare(PHP_VERSION, "5.4.0", "<") &&
get_magic_quotes_gpc())
{
$string = stripslashes(str_replace("\\", "\\\\", $string));
}
if(!is_numeric($string))
{
/*

View file

@ -94,10 +94,6 @@ class DBMssql extends DB
*/
function addQuotes($string)
{
if(version_compare(PHP_VERSION, "5.4.0", "<") && get_magic_quotes_gpc())
{
$string = stripslashes(str_replace("\\", "\\\\", $string));
}
//if(!is_numeric($string)) $string = str_replace("'","''",$string);
return $string;

View file

@ -116,10 +116,6 @@ class DBMysql extends DB
*/
function addQuotes($string)
{
if(version_compare(PHP_VERSION, "5.4.0", "<") && get_magic_quotes_gpc())
{
$string = stripslashes(str_replace("\\", "\\\\", $string));
}
if(!is_numeric($string))
{
$string = @mysql_real_escape_string($string);

View file

@ -61,10 +61,6 @@ class DBMysqli extends DBMysql
*/
function addQuotes($string)
{
if(version_compare(PHP_VERSION, "5.4.0", "<") && get_magic_quotes_gpc())
{
$string = stripslashes(str_replace("\\", "\\\\", $string));
}
if(!is_numeric($string))
{
$connection = $this->_getConnection('master');

View file

@ -117,8 +117,6 @@ class TemplateHandler
*/
public function compile($tpl_path, $tpl_filename, $tpl_file = '')
{
$buff = false;
// store the starting time for debug information
if(__DEBUG__ == 3)
{
@ -143,37 +141,13 @@ class TemplateHandler
$source_template_mtime = filemtime($this->file);
$latest_mtime = $source_template_mtime > $this->handler_mtime ? $source_template_mtime : $this->handler_mtime;
// cache control
$oCacheHandler = CacheHandler::getInstance('template');
// get cached buff
if($oCacheHandler->isSupport())
// get cached file
if(!file_exists($this->compiled_file) || filemtime($this->compiled_file) < $latest_mtime)
{
$cache_key = 'template:' . $this->file;
$buff = $oCacheHandler->get($cache_key, $latest_mtime);
}
else
{
if(is_readable($this->compiled_file) && filemtime($this->compiled_file) > $latest_mtime && filesize($this->compiled_file))
{
$buff = 'file://' . $this->compiled_file;
}
FileHandler::writeFile($this->compiled_file, $this->parse());
}
if($buff === FALSE)
{
$buff = $this->parse();
if($oCacheHandler->isSupport())
{
$oCacheHandler->put($cache_key, $buff);
}
else
{
FileHandler::writeFile($this->compiled_file, $buff);
}
}
$output = $this->_fetch($buff);
$output = $this->_fetch($this->compiled_file);
if($__templatehandler_root_tpl == $this->file)
{
@ -358,54 +332,20 @@ class TemplateHandler
* @param string $buff if buff is not null, eval it instead of including compiled template file
* @return string
*/
private function _fetch($buff)
private function _fetch($filename)
{
if(!$buff)
{
return;
}
$__Context = Context::getInstance();
$__Context->tpl_path = $this->path;
$level = ob_get_level();
$__ob_level_before_fetch = ob_get_level();
ob_start();
if(substr($buff, 0, 7) == 'file://')
{
if(__DEBUG__)
{
//load cache file from disk
$eval_str = FileHandler::readFile(substr($buff, 7));
$eval_str_buffed = "?>" . $eval_str;
@eval($eval_str_buffed);
$error_info = error_get_last();
//parse error
if ($error_info['type'] == 4)
{
throw new Exception("Error Parsing Template - {$error_info['message']} in template file {$this->file}");
}
}
else
{
include(substr($buff, 7));
}
}
else
{
$eval_str = "?>" . $buff;
@eval($eval_str);
$error_info = error_get_last();
//parse error
if ($error_info['type'] == 4)
{
throw new Exception("Error Parsing Template - {$error_info['message']} in template file {$this->file}");
}
}
include $filename;
$contents = '';
while (ob_get_level() - $level > 0) {
$contents .= ob_get_contents();
ob_end_clean();
while (ob_get_level() > $__ob_level_before_fetch)
{
$contents .= ob_get_clean();
}
return $contents;
}

View file

@ -651,6 +651,32 @@ class adminAdminController extends admin
Rhymix\Framework\Config::set('url.http_port', $vars->http_port ?: null);
Rhymix\Framework\Config::set('url.https_port', $vars->https_port ?: null);
Rhymix\Framework\Config::set('url.ssl', $use_ssl);
getController('module')->updateSite((object)array(
'site_srl' => 0,
'domain' => preg_replace('@^https?://@', '', $default_url),
));
// Object cache
if ($vars->object_cache_type)
{
if ($vars->object_cache_type === 'memcached' || $vars->object_cache_type === 'redis')
{
$cache_config = $vars->object_cache_type . '://' . $vars->object_cache_host . ':' . intval($vars->object_cache_port);
}
else
{
$cache_config = $vars->object_cache_type;
}
if (!CacheHandler::isSupport($vars->object_cache_type, $cache_config))
{
return new Object(-1, 'msg_cache_handler_not_supported');
}
Rhymix\Framework\Config::set('cache', array($cache_config));
}
else
{
Rhymix\Framework\Config::set('cache', array());
}
// Other settings
Rhymix\Framework\Config::set('use_rewrite', $vars->use_rewrite === 'Y');

View file

@ -450,6 +450,27 @@ class adminAdminView extends admin
Context::set('http_port', Rhymix\Framework\Config::get('url.http_port'));
Context::set('https_port', Rhymix\Framework\Config::get('url.https_port'));
// Object cache
$object_cache_config = Rhymix\Framework\Config::get('cache');
if (is_array($object_cache_config))
{
$object_cache_config = array_first($object_cache_config);
}
$object_cache_types = array('apc', 'file', 'memcached', 'redis', 'wincache');
$object_cache_type = preg_match('/^(' . implode('|', $object_cache_types) . ')/', $object_cache_config, $matches) ? $matches[1] : '';
Context::set('object_cache_types', $object_cache_types);
Context::set('object_cache_type', $object_cache_type);
if ($object_cache_type)
{
Context::set('object_cache_host', parse_url($object_cache_config, PHP_URL_HOST) ?: null);
Context::set('object_cache_port', parse_url($object_cache_config, PHP_URL_PORT) ?: null);
}
else
{
Context::set('object_cache_host', null);
Context::set('object_cache_port', null);
}
// Other settings
Context::set('use_mobile_view', Rhymix\Framework\Config::get('use_mobile_view'));
Context::set('use_rewrite', Rhymix\Framework\Config::get('use_rewrite'));

View file

@ -86,6 +86,11 @@ $lang->about_minify_scripts = 'Automatically minify all CSS and JS scripts in th
$lang->use_gzip = 'gzip Compression';
$lang->delay_session = 'Delay session start';
$lang->about_delay_session = 'To improve performance when using a caching proxy server such as Varnish, do not issue sessions to visitors until they log in.<br>Selecting this option may cause view counts and visitor counts to become inaccurate.';
$lang->use_object_cache = 'Use Object Cache';
$lang->use_object_cache_do_not_use = 'none';
$lang->cache_host = 'Host';
$lang->cache_port = 'Port';
$lang->msg_cache_handler_not_supported = 'Your server does not support the selected cache method, or Rhymix is unable to use the cache with the given settings.';
$lang->msg_invalid_default_url = 'The default URL is invalid.';
$lang->msg_default_url_ssl_inconsistent = 'In order to use SSL always, the default URL must also begin with https://';
$lang->msg_default_url_http_port_inconsistent = 'In order to change the HTTP port, the default URL must also include the port number.';

View file

@ -86,6 +86,11 @@ $lang->about_minify_scripts = 'コアとすべてのモジュールに含まれ
$lang->use_gzip = 'gzip 圧縮';
$lang->delay_session = 'セッションの開始を遅延';
$lang->about_delay_session = 'Varnishなどのプロキシキャッシュサーバ使用時のパフォーマンスを向上させるために、ログインしていないユーザーには、認証セッションを付与しません。<br>このオプションを選択した場合、訪問者数とヒット集計が正確でない場合があります。';
$lang->use_object_cache = 'オブジェクトキャッシュ';
$lang->use_object_cache_do_not_use = '使用していない';
$lang->cache_host = 'ホスト';
$lang->cache_port = 'ポート';
$lang->msg_cache_handler_not_supported = '選択したキャッシュ方式をサーバーでサポートされていないか、与えられた情報でキャッシュにアクセスすることができません。';
$lang->msg_invalid_default_url = '基本URLが正しくありません。';
$lang->msg_default_url_ssl_inconsistent = 'SSLを常に使用する場合、基本URLもhttps//で始まる必要があります。';
$lang->msg_default_url_http_port_inconsistent = 'HTTPポートを変更する場合、基本URLも同じポートが含まれている必要があります。';

View file

@ -86,6 +86,11 @@ $lang->about_minify_scripts = '코어와 모든 모듈에 포함된 CSS, JS 파
$lang->use_gzip = 'gzip 압축';
$lang->delay_session = '세션 시작 지연';
$lang->about_delay_session = 'Varnish 등의 프록시 캐싱 서버 사용시 성능 개선을 위해, 로그인하지 않은 사용자에게는 인증 세션을 부여하지 않습니다.<br>이 옵션을 선택할 경우 방문자 수 및 조회수 집계가 정확하게 이루어지지 않을 수 있습니다.';
$lang->use_object_cache = '오브젝트 캐시 사용';
$lang->use_object_cache_do_not_use = '사용하지 않음';
$lang->cache_host = '호스트';
$lang->cache_port = '포트';
$lang->msg_cache_handler_not_supported = '선택하신 캐시 방식을 서버에서 지원하지 않거나, 주어진 정보로 캐시에 접속할 수 없습니다.';
$lang->msg_invalid_default_url = '기본 URL이 올바르지 않습니다.';
$lang->msg_default_url_ssl_inconsistent = 'SSL을 항상 사용하실 경우 기본 URL도 https://로 시작해야 합니다.';
$lang->msg_default_url_http_port_inconsistent = 'HTTP 포트를 변경하실 경우 기본 URL에도 동일한 포트가 포함되어야 합니다.';

View file

@ -58,6 +58,19 @@
<label for="use_db_session_n" class="x_inline"><input type="radio" name="use_db_session" id="use_db_session_n" value="N" checked="checked"|cond="!$use_db_session" /> {$lang->cmd_no}</label>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label">{$lang->use_object_cache}</label>
<div class="x_controls">
<select name="object_cache_type" id="object_cache_type">
<option value="">{$lang->use_object_cache_do_not_use}</option>
<option value="{$key}" loop="$object_cache_types=>$key" selected="selected"|cond="$key==$object_cache_type">{$key}</option>
</select>
<div id="object_cache_additional_config" class="x_inline" style="display:none;margin-left:16px">
<label for="object_cache_host" class="x_inline">{$lang->cache_host}: <input type="text" name="object_cache_host" id="object_cache_host" value="{$object_cache_host}" /></label>
<label for="object_cache_port" class="x_inline">{$lang->cache_port}: <input type="number" name="object_cache_port" id="object_cache_port" size="5" style="min-width:70px" value="{$object_cache_port}" /></label>
</div>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label">{$lang->minify_scripts}</label>
<div class="x_controls">

View file

@ -2,6 +2,27 @@ jQuery(function($){
$('.tgContent ul').bind('click', function(){
$('#sitefind_addBtn').css('display','');
});
if ($("#object_cache_type").size()) {
$("#object_cache_type").on("change", function() {
if ($(this).val().match(/memcache|redis/)) {
$("#object_cache_additional_config").show();
if (!$("#object_cache_host").val()) {
$("#object_cache_host").val('127.0.0.1');
}
if (!$("#object_cache_port").val()) {
$("#object_cache_port").val($(this).val().match(/memcache/) ? '11211' : '6379');
}
if ($(this).val().match(/memcache/) && $("#object_cache_port").val() == '6379') {
$("#object_cache_port").val('11211');
}
if ($(this).val().match(/redis/) && $("#object_cache_port").val() == '11211') {
$("#object_cache_port").val('6379');
}
} else {
$("#object_cache_additional_config").hide();
}
}).triggerHandler("change");
}
});
function setStartModule(){

View file

@ -164,7 +164,7 @@ class ModuleInstaller
}
$output = $oModule->moduleUninstall();
if(is_subclass_of($output, 'Object') && !$output->toBool())
if($output instanceof Object && !$output->toBool())
{
return $output;
}

View file

@ -60,7 +60,7 @@ class editorController extends editor
if(method_exists($oComponent, $method)) $output = $oComponent->{$method}();
else return new Object(-1,sprintf('%s method is not exists', $method));
if((is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output;
if($output instanceof Object && !$output->toBool()) return $output;
$this->setError($oComponent->getError());
$this->setMessage($oComponent->getMessage());

View file

@ -374,7 +374,7 @@ class widgetController extends widget
return $widget_content;
}
$oCacheHandler = CacheHandler::getInstance('template');
$oCacheHandler = CacheHandler::getInstance('object');
if($oCacheHandler->isSupport())
{
$key = 'widget_cache:' . $widget_sequence;