Ejemplo n.º 1
0
 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;
 }
Ejemplo n.º 2
0
 /**
  * 构造函数
  *
  * @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();
     }
 }