免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2740 | 回复: 10
打印 上一主题 下一主题

[分享]DB负载均衡的mysql连接类 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-19 11:47 |只看该作者 |倒序浏览
个人觉的是比较合理的一种模式了,兼顾了维护与运营。

  1. class DBLink {
  2.         var $con;
  3.         var $user;
  4.         var $password;
  5.         var $masterDB;
  6.         var $slaveDB;
  7.         var $useDB;
  8.                
  9.         function DBLink() {
  10.                 $this->user="xxx";
  11.                 $this->password="xxx";
  12.                 $this->masterDB="192.168.0.1";
  13.                 $this->slaveDB=array("192.168.0.2","192.168.0.3");
  14.                 //register_shutdown_function(array( &$this, "CloseDB" ));  //for php5
  15.         }
  16.        
  17.         function MasterDB() {
  18.                 $this->useDB=$this->masterDB;
  19.                 $this->con=mysql_connect($this->useDB,$this->user,$this->password);
  20.                 register_shutdown_function(array( &$this, "CloseDB" ));
  21.                 return $this->con;
  22.         }
  23.        
  24.         function SlaveDB() {
  25.                 $this->useDB=$this->slaveDB[array_rand($this->slaveDB)];
  26.                 $this->con=mysql_connect($this->useDB,$this->user,$this->password);
  27.                 register_shutdown_function(array( &$this, "CloseDB" ));
  28.                 return $this->con;
  29.         }
  30.        
  31.         function CustomDB($db) {
  32.                 $this->useDB=$db;
  33.                 $this->con=mysql_connect($this->useDB,$this->user,$this->password);
  34.                 register_shutdown_function(array( &$this, "CloseDB" ));
  35.                 return $this->con;
  36.         }
  37.        
  38.         function CloseDB() {
  39.                 $result=mysql_close($this->con);
  40.                 $ip=explode('.',$this->useDB);
  41.                 if ($result) {
  42.                         print "<!-- {$ip[3]} closed! -->";
  43.                 } else {
  44.                         print "<!-- {$ip[3]} close failed! -->";
  45.                 }
  46.                 return $result;
  47.         }
  48. }
复制代码

[ 本帖最后由 枫叶红了 于 2006-1-20 18:37 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-01-20 01:18 |只看该作者
说点无关的, PHP4中这样用 register_shutdown_function() 会有问题.

论坛徽章:
0
3 [报告]
发表于 2006-01-20 09:48 |只看该作者
啊,就这么几个方法啊。

论坛徽章:
0
4 [报告]
发表于 2006-01-20 10:19 |只看该作者
原帖由 hightman 于 2006-1-20 01:18 发表
说点无关的, PHP4中这样用 register_shutdown_function() 会有问题.


能说一下是哪一个版本会有什么样问题的吗?

PHP 4.3.10 测试通过

论坛徽章:
0
5 [报告]
发表于 2006-01-20 10:32 |只看该作者
原帖由 spiceboy 于 2006-1-20 09:48 发表
啊,就这么几个方法啊。


只是一个DB连接类,主要是便于某台DB出问题时做切换,其他的操作可以在类的外部执行,维护起来方便一些。

遇到过在类中mysql_select_db失效的问题,必须在类外重新执行一次mysql_select_db才正常,不知道各位
有没有遇到过,我是在将PHP从4.3.6升级到4.4.1后发生的该问题,之前一切正常。升级到4.3.10也同样会发生
此故障,php的BUG?

论坛徽章:
0
6 [报告]
发表于 2006-01-20 11:02 |只看该作者
原帖由 枫叶红了 于 2006-1-20 10:19 发表


能说一下是哪一个版本会有什么样问题的吗?

PHP 4.3.10 测试通过


你试试显示出 CloseDB 中的 $this->conn 就知道了.
也就是说你的程序结束, 代码中如果没有调用 CloseDB 方法, 而通过 register_shutdown_functions 自动调用的话, 实际上是没有用的

不过PHP结束时相关的资源都会释放, 也无所谓

论坛徽章:
0
7 [报告]
发表于 2006-01-20 11:57 |只看该作者
原帖由 hightman 于 2006-1-20 11:02 发表


你试试显示出 CloseDB 中的 $this->conn 就知道了.
也就是说你的程序结束, 代码中如果没有调用 CloseDB 方法, 而通过 register_shutdown_functions 自动调用的话, 实际上是没有用的

不过PHP结束时相关 ...


                if ($result) {
                        print "<!-- {$ip[3]} closed! -->";
                } else {
                        print "<!-- {$ip[3]} close failed! -->";
                }

这段代码 能成功输出到页尾 不就说明程序结束前调用了CloseDB方法吗?

论坛徽章:
0
8 [报告]
发表于 2006-01-20 18:00 |只看该作者
原帖由 枫叶红了 于 2006-1-20 11:57 发表


                if ($result) {
                        print "<!-- {$ip[3]} closed! -->";
                } else {
                        print "<!-- {$ip[3]} close  ...


会调用, 不过调用的是 这个类的一个拷贝而不是引用!

也就是说这之间 mysql_close($this->Conn) 其实是无效的, 因为你注册函数时 $this->Conn 的值并未被设定.

相关测试及说明请看我以前发的 http://php.twomice.net/show_hdr. ... =P7SRG11&xpos=6

曾在php.net 汇报过这个 bug, 不过开发组表示这是已知bug并不打算修正, 是PHP4的引擎所决定的, php5中已作修正.

论坛徽章:
0
9 [报告]
发表于 2006-01-20 18:35 |只看该作者
原帖由 hightman 于 2006-1-20 18:00 发表


会调用, 不过调用的是 这个类的一个拷贝而不是引用!

也就是说这之间 mysql_close($this->Conn) 其实是无效的, 因为你注册函数时 $this->Conn 的值并未被设定.

相关测试及说明请看我以前发的 [url ...


你的意思是在注册函数时,他只保存当前变量的值?这样的话 把 register_shutdown_function(array( &$this, "CloseDB" )) 换个位置放到每个方法里,就OK了

论坛徽章:
0
10 [报告]
发表于 2006-01-20 19:22 |只看该作者
无所谓的啊, 打开的连接PHP一结束会自己关关掉的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP