ThinkPHP处理海量数据分表机制详细代码及说明_PHP教程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了ThinkPHP处理海量数据分表机制详细代码及说明_PHP教程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2452字,纯文字阅读大概需要4分钟。
内容图文
![ThinkPHP处理海量数据分表机制详细代码及说明_PHP教程](/upload/InfoBanner/zyjiaocheng/176/ea60889e37684f1390a57afbe55fc6ff.jpg)
数据表:
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 = ($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;$i<$this->partition[num];$i++)
$tableName[] = SELECT * FROM .$this->getTableName()._.$i;
$tableName = ( .implode(" UNION ",$tableName).) AS .$this->name;
return $tableName;
}
}
http://www.bkjia.com/PHPjc/486019.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/486019.htmlTechArticle应用ThinkPHP内置的分表算法处理百万级用户数据. 数据表: house_member_0 house_member_1 house_member_2 house_member_3 模型中 class MemberModel extends AdvMode...
内容总结
以上是互联网集市为您收集整理的ThinkPHP处理海量数据分表机制详细代码及说明_PHP教程全部内容,希望文章能够帮你解决ThinkPHP处理海量数据分表机制详细代码及说明_PHP教程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。