php多数据库支持的应用程序设计

 更新时间:2008年08月12日 12:26:47   作者:  
以前做PHP应用,多数是单数据库数据查询和更新,顶多也是主从数据库的支持,实现起来相对简单。主从数据库的问题在于,当会话存储在数据库的时候,同步将可能出现问题,也就是说有可能出现会话的中断。

首先以单例摸式创建DB类:
复制代码 代码如下:

<?php
if (!defined("DB_FETCH_ASSOC")) {
    define("DB_FETCH_ASSOC", 1);
}

if (!defined("DB_FETCH_ROW")) {
    define("DB_FETCH_ROW", 2);
}

if (!defined("DB_FETCH_ARRAY")) {
    define("DB_FETCH_ARRAY", 3);
}

if (!defined("DB_FETCH_DEFAULT")) {
    define("DB_FETCH_DEFAULT", DB_FETCH_ASSOC);
}
class DB {
    function DB($dsn, $db_key, $p_conn, $fetch_mode) {
        $this->dsn        = $dsn;
        $this->db_key     = $db_key;
        $this->sql        = '';
        $this->sqls       = array();
        $this->u_sqls     = array();
        $this->q_sqls     = array();
        $this->u_conn     = null;
        $this->q_conn     = null;
        $this->p_conn     = $p_conn;
        $this->fecth_mode = $fetch_mode;
        $this->query_num  = 0;
        $this->update_num = 0;
    }

    function &init(& $dsn, $db_key, $p_conn = false, $fetch_mode = DB_FETCH_DEFAULT) {
        static $db;
        $db_key = explode('.', $db_key);
        $db_key = "['" . implode("']['" , $db_key) . "']";
        eval('$flag = isset($db' . $db_key . ');');
        eval("\$db_info = \$dsn['db_info']" . $db_key . ";");
        if (!$flag) {
            $obj = new DB($db_info, $db_key, $p_conn, $fetch_mode);
            eval('$db' . $db_key . ' = $obj;');
            unset($obj);
        }
        return $db;
    }
}
$db = &DB::init($configs, 'blog.0');
print_r($db);
?>

  从上面打印结果可以看出,blog数据库集群的第一组数据库服务器被载入到$this->dsn中了。这个下面就是简单的数据COPY的主从服务器,所以可以使用随机数来指定到某一台服务器。以下是一个简单的随机数实现:
复制代码 代码如下:

class DB {
    //....

    function connectDB($type = "master") {
        if ($type == "master") {
            $db_host = $this->dsn["master"]["db_host"];
            $db_name = $this->dsn["master"]["db_name"];
            $db_user = $this->dsn["master"]["db_user"];
            $db_pass = $this->dsn["master"]["db_pass"];
            $this->u_conn = mysqli_connect($db_host, $db_user, $db_pass);
            $this->selectDB($db_name, $this->conn);
            if (!$this->u_conn) {
                $message = "Update DataBase Connect False : ($db_host, $db_user, ******) !";
                $this->error($message, 0);
            }
        } else {
            if (empty($_COOKIE[$_configs['cookie_prefix'] . 'db_no'])) {
                $db_no = array_rand($this->dsn["db_info"]["slave"]);
            } else {
                $db_no = $_COOKIE[$_configs['cookie_prefix'] . 'db_no'];
            }
            $db_info = $this->dsn["slave"][$db_no];
            $db_host = $db_info["db_host"];
            $db_name = $db_info["db_name"];
            $db_user = $db_info["db_user"];
            $db_pass = $db_info["db_pass"];
            $this->q_conn = mysqli_connect($db_host, $db_user, $db_pass);

            if (!$this->q_conn) {
                if (!$this->u_conn) {
                    $this->connectDB();
                }
                $this->q_conn = $this->u_conn;
                if (!$this->q_conn) {
                    $message = "Query DataBase Connect False : ($db_host, $db_user, ******) !";
                    $this->error($message, 0);
                }
            } else {
                $this->selectDB($db_name, $this->q_conn);
            }
        }
    }

    function selectDB($db_name, $conn) {
        if ($db_name != null) {
            if(! mysqli_select_db($conn, $db_name)) {
                $code = mysqli_errno($conn);
                $message = mysqli_error($conn);
                $this->error($message, $code);
            }
            return true;
        }
        return false;
    }

    function query($sql, $limit = 1, $quick = false) {
        if ($limit != null) {
            $sql = $sql . " LIMIT " . $limit;
        }
        $this->sqls[] = $sql;
        $this->q_sqls[] = $sql;
        $this->sql = $sql;

        if (empty($this->q_conn)) {
            $this->connectDB("slave");
        }
        $this->qrs = mysqli_query($this->q_conn, $sql, $quick ? MYSQLI_USE_RESULT : MYSQLI_STORE_RESULT);
        if (!$this->qrs) {
            $code = mysqli_errno($this->q_conn);
            $message = mysqli_error($this->q_conn);
            $this->error($message, $code);
        }
        $this->query_num++;
        return $this->qrs;
    }

    function update($sql) {
        $this->sql = $sql;
        $this->sqls[] = $this->sql;
        $this->u_sqls[] = $this->sql;
        if ($this->u_conn == null) {
            $this->connectDB("master");
        }

        $this->urs = mysqli_query($this->u_conn, $sql, MYSQLI_USE_RESULT);
        $this->update_num++;

        if (!$this->urs) {
            return false;
        } else {
            return true;
        }
    }
}

  至此,基本框架已经出来了,来看看调用方法: <?php
// 连接到第一组会话服务器
$db = &DB::init($configs, 'session.0');
//  执行一次查询
$db['session'][0]->query('SELECT ...');

//  再次连接BLOG服务器
$db = &DB::init($configs, 'blog.1');
//  执行一次更新
$db['blog'][1]->update('UPDATE ...');

//  再次调用会话更新
$db['session'][0]->update('INSERT ...');
?>

相关文章

  • php之curl设置超时实例

    php之curl设置超时实例

    这篇文章主要介绍了php中curl设置超时的方法,实例讲述了curl中各种超时设置的方法,非常具有实用价值,需要的朋友可以参考下
    2014-11-11
  • 谈谈PHP的输入输出流

    谈谈PHP的输入输出流

    谈谈PHP的输入输出流...
    2007-02-02
  • PHP调用MySQL的存储过程的实现代码

    PHP调用MySQL的存储过程的实现代码

    MySQL好像从5.0开始才引入存储过程,反正以前做应用的时候从没碰过,不过现在因为主要作内部系统
    2008-08-08
  • 如何让PHP编码更加好看利于阅读

    如何让PHP编码更加好看利于阅读

    在本篇文章里小编给大家分享了关于如何让PHP编码更加好看利于阅读的方法和习惯,需要的朋友们可以学习下。
    2019-05-05
  • PHP实现读取Excel文件的记录(一)

    PHP实现读取Excel文件的记录(一)

    这篇文章主要介绍了如何利用PHP读取Excel文件的记录,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的可以跟随小编了解一下
    2022-03-03
  • php mysql操作mysql_connect连接数据库实例详解

    php mysql操作mysql_connect连接数据库实例详解

    php操作数据库首先必须连接到指定的数据库,连接数据库可以使用PHP mysql_connect函数,本文章向大家介绍mysql_connect函数的使用方法和实例,需要的朋友可以参考一下
    2016-12-12
  • php实现批量删除挂马文件及批量替换页面内容完整实例

    php实现批量删除挂马文件及批量替换页面内容完整实例

    这篇文章主要介绍了php实现批量删除挂马文件及批量替换页面内容的方法,涉及php文件与目录的遍历、查找以及字符串与数组的遍历与替换操作相关技巧,适用于utf-8编码环境,需要的朋友可以参考下
    2016-07-07
  • php搜索文件程序分享

    php搜索文件程序分享

    php文件查找程序,输入一个路径确定后会遍历目录下所有的文件和文件夹,通过递归可以找到文件夹下面的每一个文件,再通过文件名和输入的关键字匹配,则可以查找到你想要的文件,需要的朋友可以参考下
    2015-10-10
  • 基于php编程规范(详解)

    基于php编程规范(详解)

    下面小编就为大家带来一篇基于php编程规范(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • php中文字符截取防乱码

    php中文字符截取防乱码

    当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。而值为0x81到0xff与0x00组合始终都显示为“空” 根据这一特点,在substr的结果后面补上一个chr(0),就可以防止出现乱码了
    2008-03-03

最新评论