仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1906|回复: 20
打印 上一主题 下一主题

[学习教程] PHP网站制作之ThinkPHP处置海量数据分表机制具体代码...

[复制链接]
逍遥一派 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:39:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
熟悉了PHP和MYSQL开发的要领之后,再回头看你写的那个留言本,你也许会怀疑那真的是你写的吗?当然,如果屋里还有鬼的话,也许是它写的-_-      使用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 = ($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;
  }
  }
<P style="TEXT-INDENT: 2em">
要想从事软件开发工作,那么,还有很多的知识要学习,其实,不管是以后想去从事哪个工作,都需要自己去利用空闲的时间去不断的学习新的知识,不断的充实自己。
透明 该用户已被删除
沙发
发表于 2015-2-4 05:01:19 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
若相依 该用户已被删除
板凳
发表于 2015-2-5 00:49:02 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
admin 该用户已被删除
地板
发表于 2015-2-5 04:21:08 | 只看该作者
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
活着的死人 该用户已被删除
5#
发表于 2015-2-7 05:06:48 | 只看该作者
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
冷月葬花魂 该用户已被删除
6#
发表于 2015-2-20 14:24:17 | 只看该作者
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
老尸 该用户已被删除
7#
发表于 2015-3-6 18:18:25 | 只看该作者
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
若天明 该用户已被删除
8#
发表于 2015-3-13 05:08:44 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
若天明 该用户已被删除
9#
发表于 2015-3-13 05:08:43 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
第二个灵魂 该用户已被删除
10#
发表于 2015-3-13 05:08:44 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
兰色精灵 该用户已被删除
11#
发表于 2015-3-13 05:08:42 | 只看该作者
当然这种网站的会员费就几十块钱。
再见西城 该用户已被删除
12#
发表于 2015-3-13 08:08:40 | 只看该作者
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
愤怒的大鸟 该用户已被删除
13#
发表于 2015-3-17 16:54:28 | 只看该作者
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
小妖女 该用户已被删除
14#
发表于 2015-3-19 13:58:53 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
爱飞 该用户已被删除
15#
发表于 2015-3-23 02:40:21 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
乐观 该用户已被删除
16#
发表于 2015-4-11 03:38:51 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
灵魂腐蚀 该用户已被删除
17#
发表于 2015-4-16 12:09:41 | 只看该作者
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
小女巫 该用户已被删除
18#
发表于 2015-4-26 03:08:04 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
深爱那片海 该用户已被删除
19#
发表于 2015-4-30 14:24:04 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
只想知道 该用户已被删除
20#
发表于 2015-5-5 04:19:39 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-14 13:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表