应用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先行者学习网