public function getShardInfo() { if (empty(self::$_virtShards)) { $vsconfig = (require _CONFIG_ . DIRECTORY_SEPARATOR . 'shard.php'); $this->_vsconfig = $vsconfig; $infokey = $vsconfig['infokey']; $info_uptime_key = $infokey . '_uptime'; $redis = Leb_Dao_Redis::getInstance($vsconfig['redis']); // TODO 远程读取redis缓存的速度,和$value的大小关系非常大。 // 所以还可以考虑把$value值压缩后存储,能从redis读取的时候快些。 // 存储在本地磁盘还是快些,可以考虑再加一层缓存, // 通过本地更新时间与redis更新时间确定是否需要拿数据库新值。 $vsinfos = array(); if (($gz_jvsdata = $redis->get($infokey)) !== false) { $jvsdata = gzuncompress($gz_jvsdata); if ($jvsdata === false) { $vsinfos = json_decode($gz_jvsdata, true); if ($vsinfos) { $redis->set($infokey, gzcompress($gz_jvsdata)); } else { $this->_error = 'Unknown shard info cache format, no json, no gzjson.'; } } else { $vsinfos = json_decode($jvsdata, true); } } else { $dbConfig = $vsconfig['database']; $dbh = Leb_Dao_Abstract::getInstance($dbConfig); if (!$dbh) { return false; } else { $sql = "SELECT * FROM `{$vsconfig['tablename']}` LIMIT 4096"; $vsrecords = $dbh->query($sql); if (!$vsrecords) { $dbh = null; return false; } else { foreach ($vsrecords as $idx => $record) { $vsinfos['byid'][$record['vsid']] = $record; $bynameKey = "{$record['shard_name']}_{$record['shard_value']}"; $vsinfos['byname'][$bynameKey][$record['vsid']] = $record; $vsinfos['uptime'] = time(); } $bret = $redis->set($infokey, gzcompress(json_encode($vsinfos))); $bret = $redis->set($info_uptime_key, $vsinfos['uptime']); } } } if (!empty($vsinfos)) { self::$_virtShards = $vsinfos; } } return self::$_virtShards; }
/** * 构造函数 * * @param string $name 模型名称 * @param array $dbConfig 数据库配置 */ public function __construct($name = __CLASS__, $dbConfig = '') { // 模型初始化 $this->_initialize(); // 获取模型名称 $this->_name = $name; //使用默认配置 if (empty($dbConfig)) { $dbConfig = (require _CONFIG_ . 'db.php'); } $this->_dao = Leb_Dao_Abstract::getInstance($dbConfig); if (isset($dbConfig['debug'])) { self::$debug = $dbConfig['debug']; $this->_dao->setDaoType($this->_daoType); $this->_dao->debug = $dbConfig['debug']; } //表单令牌验证 defined('_TOKEN_ON_') && (self::$tokenOn = _TOKEN_ON_); defined('_TOKEN_NAME_') && (self::$tokenName = _TOKEN_NAME_); isset($dbConfig['dbFieldtypeCheck']) && (self::$dbFieldtypeCheck = $dbConfig['dbFieldtypeCheck']); // 设置表前缀 $modelName = get_class($this); $refc = new ReflectionClass($modelName); $tpprop = $refc->getProperty('_tablePrefix'); $decl = $tpprop->getDeclaringClass(); if ($tpprop->class != $modelName) { $this->_tablePrefix = $this->_tablePrefix ? $this->_tablePrefix : @$dbConfig['tablePrefix']; $this->_tableSuffix = $this->_tableSuffix ? $this->_tableSuffix : @$dbConfig['tableSuffix']; } //初始化数据库名 if ('' == $this->_dbName) { if (isset($dbConfig[self::DB_CFG_MASTER][self::DB_CFG_DBNAME])) { $this->_dbName = $dbConfig[self::DB_CFG_MASTER][self::DB_CFG_DBNAME]; } else { isset($dbConfig[self::DB_CFG_DBNAME]) && ($this->_dbName = $dbConfig[self::DB_CFG_DBNAME]); } } $this->_dbConfig = $dbConfig; unset($dbConfig); // lazyed check table if (!empty($this->_tableName) && $this->_autoCheckFields) { // $this->_checkTableInfo(); } }