• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

ThinkPHP处置海量数据分表机制详细代码

php 搞代码 4年前 (2022-01-24) 14次浏览 已收录 0个评论

ThinkPHP处理海量数据分表机制详细代码

应用ThinkPHP内置的分表算法处理百万级用户数据.  数据表:  house_member_0  house_member_1  house_member_2  house_member_3  模型中  class MemberModel extends AdvModel {  protected $partition = array('field'=>'username','type'=>'id','num'=>'4');  public function getDao($data=array()) {  $data = empty($data) ? $_POST : $data;  $table = $this->getPartitionTableName($data);  return $this->table($table);  }  }  方法中  class MemberAction extends BaseAction {  public function login() {  if($this->isPost()) {  $this->validToken();  $dao = D('Member')->getDao();  $res = $dao->where('username = '.$_POST['username'])->find();  // output 为自定义方法  // $isAjax - bool  $this->output(false);  }  $this->display();  }  }  /**  +----------------------  * 得到分表的的数据表名  +----------------------  * @access public  +----------------------  * @param array $data 操作的数据  +----------------------  * @return string  +----------------------  */  public function getPartitionTableName($data=array()) {  // 对数据表进行分区  if(isset($data[$this->partition['field']])) {  $field = $data[$this->partition['field']];  switch($this->partition['type']) {  case 'id':  // 按照id范围分表  $step = $this->partition['expr'];  $seq = floor($field / $step)+1;  break;  case 'year':  // 按照年份分表  if(!is_numeric($field)) {  $field = strtotime($field);  }  $seq = date('Y',$field)-$this->partition['expr']+1;  break;  case 'mod':  // 按照id的模数分表  $seq =<mark style="color:transparent">来4源gaodaimacom搞#代%码*网</mark><code>搞代gaodaima码</code> ($field % $this->partition['num'])+1;  break;  case 'md5':  // 按照md5的序列分表  $seq = (ord(substr(md5($field),0,1)) % $this->partition['num'])+1;  break;  default :  if(function_exists($this->partition['type'])) {  // 支持指定函数哈希  $fun = $this->partition['type'];  $seq = (ord(substr($fun($field),0,1)) % $this->partition['num'])+1;  }else{  // 按照字段的首字母的值分表  $seq = (ord($field{0}) % $this->partition['num'])+1;  }  }  return $this->getTableName().'_'.$seq;  }else{  // 当设置的分表字段不在查询条件或者数据中  // 进行联合查询,必须设定 partition['num']  $tableName = array();  for($i=0;$ipartition['num'];$i++)  $tableName[] = 'SELECT * FROM '.$this->getTableName().'_'.$i;  $tableName = '( '.implode(" UNION ",$tableName).') AS '.$this->name;  return $tableName;  }  }

?


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:ThinkPHP处置海量数据分表机制详细代码
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址