html5中文学习网

您的位置: 首页 > 网络编程 > PHP编程 » 正文

ThinkPHP处理海量数据分表机制详细代码及说明_PHP教程_编程技术

[ ] 已经帮助:人解决问题

   应用ThinkPHP内置的分表算法处理百万级用户数据.9t3HTML5中文学习网 - HTML5先行者学习网

  数据表:9t3HTML5中文学习网 - HTML5先行者学习网

  house_member_09t3HTML5中文学习网 - HTML5先行者学习网

  house_member_19t3HTML5中文学习网 - HTML5先行者学习网

  house_member_29t3HTML5中文学习网 - HTML5先行者学习网

  house_member_39t3HTML5中文学习网 - HTML5先行者学习网

  模型中9t3HTML5中文学习网 - HTML5先行者学习网

  class MemberModel extends AdvModel {9t3HTML5中文学习网 - HTML5先行者学习网

  protected $partition = array('field'=>'username','type'=>'id','num'=>'4');9t3HTML5中文学习网 - HTML5先行者学习网

  public function getDao($data=array()) {9t3HTML5中文学习网 - HTML5先行者学习网

  $data = empty($data) ? $_POST : $data;9t3HTML5中文学习网 - HTML5先行者学习网

  $table = $this->getPartitionTableName($data);9t3HTML5中文学习网 - HTML5先行者学习网

  return $this->table($table);9t3HTML5中文学习网 - HTML5先行者学习网

  }9t3HTML5中文学习网 - HTML5先行者学习网

  }9t3HTML5中文学习网 - HTML5先行者学习网

  方法中9t3HTML5中文学习网 - HTML5先行者学习网

  class MemberAction extends BaseAction {9t3HTML5中文学习网 - HTML5先行者学习网

  public function login() {9t3HTML5中文学习网 - HTML5先行者学习网

  if($this->isPost()) {9t3HTML5中文学习网 - HTML5先行者学习网

  $this->validToken();9t3HTML5中文学习网 - HTML5先行者学习网

  $dao = D('Member')->getDao();9t3HTML5中文学习网 - HTML5先行者学习网

  $res = $dao->where('username = '.$_POST['username'])->find();9t3HTML5中文学习网 - HTML5先行者学习网

  // output 为自定义方法9t3HTML5中文学习网 - HTML5先行者学习网

  // $isAjax - bool9t3HTML5中文学习网 - HTML5先行者学习网

  $this->output(false);9t3HTML5中文学习网 - HTML5先行者学习网

  }9t3HTML5中文学习网 - HTML5先行者学习网

  $this->display();9t3HTML5中文学习网 - HTML5先行者学习网

  }9t3HTML5中文学习网 - HTML5先行者学习网

  }9t3HTML5中文学习网 - HTML5先行者学习网

  /**9t3HTML5中文学习网 - HTML5先行者学习网

  +----------------------------------------------------------9t3HTML5中文学习网 - HTML5先行者学习网

  * 得到分表的的数据表名9t3HTML5中文学习网 - HTML5先行者学习网

  +----------------------------------------------------------9t3HTML5中文学习网 - HTML5先行者学习网

  * @access public9t3HTML5中文学习网 - HTML5先行者学习网

  +----------------------------------------------------------9t3HTML5中文学习网 - HTML5先行者学习网

  * @param array $data 操作的数据9t3HTML5中文学习网 - HTML5先行者学习网

  +----------------------------------------------------------9t3HTML5中文学习网 - HTML5先行者学习网

  * @return string9t3HTML5中文学习网 - HTML5先行者学习网

  +----------------------------------------------------------9t3HTML5中文学习网 - HTML5先行者学习网

  */9t3HTML5中文学习网 - HTML5先行者学习网

  public function getPartitionTableName($data=array()) {9t3HTML5中文学习网 - HTML5先行者学习网

  // 对数据表进行分区9t3HTML5中文学习网 - HTML5先行者学习网

  if(isset($data[$this->partition['field']])) {9t3HTML5中文学习网 - HTML5先行者学习网

  $field = $data[$this->partition['field']];9t3HTML5中文学习网 - HTML5先行者学习网

  switch($this->partition['type']) {9t3HTML5中文学习网 - HTML5先行者学习网

  case 'id':9t3HTML5中文学习网 - HTML5先行者学习网

  // 按照id范围分表9t3HTML5中文学习网 - HTML5先行者学习网

  $step = $this->partition['expr'];9t3HTML5中文学习网 - HTML5先行者学习网

  $seq = floor($field / $step)+1;9t3HTML5中文学习网 - HTML5先行者学习网

  break;9t3HTML5中文学习网 - HTML5先行者学习网

  case 'year':9t3HTML5中文学习网 - HTML5先行者学习网

  // 按照年份分表9t3HTML5中文学习网 - HTML5先行者学习网

  if(!is_numeric($field)) {9t3HTML5中文学习网 - HTML5先行者学习网

  $field = strtotime($field);9t3HTML5中文学习网 - HTML5先行者学习网

  }9t3HTML5中文学习网 - HTML5先行者学习网

  $seq = date('Y',$field)-$this->partition['expr']+1;9t3HTML5中文学习网 - HTML5先行者学习网

  break;9t3HTML5中文学习网 - HTML5先行者学习网

  case 'mod':9t3HTML5中文学习网 - HTML5先行者学习网

  // 按照id的模数分表9t3HTML5中文学习网 - HTML5先行者学习网

  $seq = ($field % $this->partition['num'])+1;9t3HTML5中文学习网 - HTML5先行者学习网

  break;9t3HTML5中文学习网 - HTML5先行者学习网

  case 'md5':9t3HTML5中文学习网 - HTML5先行者学习网

  // 按照md5的序列分表9t3HTML5中文学习网 - HTML5先行者学习网

  $seq = (ord(substr(md5($field),0,1)) % $this->partition['num'])+1;9t3HTML5中文学习网 - HTML5先行者学习网

  break;9t3HTML5中文学习网 - HTML5先行者学习网

  default :9t3HTML5中文学习网 - HTML5先行者学习网

  if(function_exists($this->partition['type'])) {9t3HTML5中文学习网 - HTML5先行者学习网

  // 支持指定函数哈希9t3HTML5中文学习网 - HTML5先行者学习网

  $fun = $this->partition['type'];9t3HTML5中文学习网 - HTML5先行者学习网

  $seq = (ord(substr($fun($field),0,1)) % $this->partition['num'])+1;9t3HTML5中文学习网 - HTML5先行者学习网

  }else{9t3HTML5中文学习网 - HTML5先行者学习网

  // 按照字段的首字母的值分表9t3HTML5中文学习网 - HTML5先行者学习网

  $seq = (ord($field{0}) % $this->partition['num'])+1;9t3HTML5中文学习网 - HTML5先行者学习网

  }9t3HTML5中文学习网 - HTML5先行者学习网

  }9t3HTML5中文学习网 - HTML5先行者学习网

  return $this->getTableName().'_'.$seq;9t3HTML5中文学习网 - HTML5先行者学习网

  }else{9t3HTML5中文学习网 - HTML5先行者学习网

  // 当设置的分表字段不在查询条件或者数据中9t3HTML5中文学习网 - HTML5先行者学习网

  // 进行联合查询,必须设定 partition['num']9t3HTML5中文学习网 - HTML5先行者学习网

  $tableName = array();9t3HTML5中文学习网 - HTML5先行者学习网

  for($i=0;$i<$this->partition['num'];$i++)9t3HTML5中文学习网 - HTML5先行者学习网

  $tableName[] = 'SELECT * FROM '.$this->getTableName().'_'.$i;9t3HTML5中文学习网 - HTML5先行者学习网

  $tableName = '( '.implode(" UNION ",$tableName).') AS '.$this->name;9t3HTML5中文学习网 - HTML5先行者学习网

  return $tableName;9t3HTML5中文学习网 - HTML5先行者学习网

  }9t3HTML5中文学习网 - HTML5先行者学习网

  }9t3HTML5中文学习网 - HTML5先行者学习网


9t3HTML5中文学习网 - HTML5先行者学习网
9t3HTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助