PHP 开发学习[7] —— 代码实现主从数据库 读写分离

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/details/53289223

     背景:项目规划中,要求进行主从数据库的读写分离,其中对于主从数据库的创建和配置,网上有很充实的介绍,这里仅在配置成功的基础上进行代码端的判断实现。

1.ThinkPHP框架中,已经集成了主从数据库的操作,其中只需要对配置文件中的相应代码做修改即可。

具体的介绍可以参考官方开发文档的介绍.

2.如果使用原生语句进行开发,需要进行sql语句的判断,根据网上的一些介绍和参考,核心代码如下。

值得一提的是,此处使用了mysql_connect()连接,据官方解释,强烈建议使用mysqli或者pdo连接.

所以,可以自行改动呗...

3.解释好麻烦,粘贴示例代码,自行参考,欢迎指正...

<?php
header('Content-Type: text/html;charset = utf-8 ');
/**
 * User: zhanghj
 */
define("DB_HOST_1","192.168.1.73");//请正确对应 IP 地址 用户名 密码 即可...
define("DB_USER_1","momomo");
define("DB_PWD_1","000000");

define("DB_HOST_2","192.168.1.74");
define("DB_USER_2","nonono");
define("DB_PWD_2","000000");

define("DB_DBNAME","minsheng");
define("DB_CHARSET","utf8");

/**
 * 思路:根据传入的sql语句,判断是否为查询操作  此处使用 mysql
 * @param $sql 执行的SQL语句
 * @return resource
 */
function connectTo($sql){
    $link = null;
    $querystr = trim($sql);
    $querystr = substr($querystr,0,6);


    if($querystr != 'select')
    {
        //如果不是查询语句就连接主服务器
        $link=@mysql_connect(DB_HOST_1,DB_USER_1,DB_PWD_1)
            or die("主库连接失败Error:".mysql_errno().":".mysql_error());
        print_r('主库连接成功');
    }else{
        //如果是查询语句就连接从服务器
        $link=@mysql_connect(DB_HOST_2,DB_USER_2,DB_PWD_2)
            or die("从库连接失败Error:".mysql_errno().":".mysql_error());
        print_r('从库连接成功');
    }

    mysql_set_charset(DB_CHARSET);//mysql_query('set names utf8');
    mysql_select_db(DB_DBNAME) or die("指定数据库打开失败");
    return $link;
}

/**
 * 完成记录插入的操作
 * @param string $table
 * @param array $array
 * @return number
 */
function insert($table,$array){
    $keys=join(",",array_keys($array));
    $vals="'".join("','",array_values($array))."'";
    $sql="insert {$table}($keys) values({$vals})";
    $link = connectTo($sql);
    mysql_query($sql);
    $Tag_id = mysql_insert_id();
    //根据需求 关闭连接
    mysql_close($link);
    return $Tag_id;
}

function getResultNum($sql){
    $link = connectTo($sql);
    $result=mysql_query($sql);
    $Tag_num = mysql_num_rows($result);
    //根据需求 关闭连接
    mysql_close($link);
    return $Tag_num;
}


/*使用提示:
    运行SQL语句前,首先调用connectTo($sql)方法,进行数据库链接的选择
    根据自己的项目需求,判断是否断开上述方法返回的连接
*/

//测试:
$data = array(
    'user_name' => 'wo¥¥ 的名字',
    'email' => '爱谁谁!别关心那么多,好嘛?'
);

echo '我在测试呢!';
$tag =insert('ms_users',$data);
echo $tag;
echo '<hr/>';
echo '<hr/>';

$res = getResultNum('select * from ms_users');
print_r($res);

4.执行代码,结果截图如下,其中第一张为初次运行的显示情况,第二张为刷新后的显示情况,跟数据表的字段限制有关,可自行检验。

5.补充使用mysqli面向对象思想的核心代码

/**
 * 思路:根据传入的sql语句,判断是否为查询操作  此处使用 mysqli
 *      前提是,开启mysqli的扩展功能
 * @param $sql 执行的SQL语句
 * @return resource
 */
function connectTo($sql){
    $mysqli = null;
    $querystr = trim($sql);
    $querystr = substr($querystr,0,6);

    //使用 mysqli 面向对象方式进行数据库的连接操作
    if($querystr != 'select')
    {
        //如果不是查询语句就连接主服务器
        //创建对象并打开连接,最后一个参数是选择的数据库名称
        $mysqli = new mysqli(DB_HOST_1,DB_USER_1,DB_PWD_1,DB_DBNAME);
        //检查连接是否成功
        if (mysqli_connect_errno()){
            die('主库连接失败Error:'). mysqli_connect_error();
        }
        print_r('主库连接成功');
    }else{
        //如果是查询语句就连接从服务器
        $mysqli = new mysqli(DB_HOST_2,DB_USER_2,DB_PWD_2,DB_DBNAME);
        //检查连接是否成功
        if (mysqli_connect_errno()){
            die('从库连接失败Error::'). mysqli_connect_error();
        }
        print_r('从库连接成功');
    }
    $mysqli->query("set names '".DB_CHARSET."'");
    return $mysqli;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LanceToBigData

MySQL(十五)之数据备份中mysqldump详解

前言   其实前面一篇数据备份已经是非常的详细了,这里我想单独的讲解一下mysqldump,相信很多程序员都是用过这个命令的! 一、MySQL数据库的备份与还原...

34780
来自专栏Danny的专栏

SQL Server 2008 附加数据库时出错

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

2.9K30
来自专栏Golang语言社区

网游内存数据库的设计(2)

续第一篇,前两天对核心存储做了些修改,以前只打算与关系数据库的行与表做对应,value类型只能使array或list, 现在把7种基本类型也加入到value支持...

41580
来自专栏cs

MySQL 问题解决

问题如下: Failed to Connect to MySQL at 127.0.0.1:3306 with user root Access denied...

41680
来自专栏乐沙弥的世界

myloader恢复mysql数据库示例

    mydumper是针对mysql数据库备份的一个轻量级第三方的开源工具,备份方式为逻辑备份。它支持多线程,备份速度远高于原生态的mysqldump以及众...

14620
来自专栏pangguoming

mysql双机热备的实现

转:http://blog.csdn.net/qq394829044/article/details/53203645

32210
来自专栏时序数据库专栏

Mysql数据导入CTSDB最佳实践

    CTSDB是一款分布式、可扩展、支持近实时数据搜索与分析的时序数据库,且兼容Elasticsearch常用的API接口。对于很多用户,想要将Mysql中...

22090
来自专栏Golang语言社区

网游内存数据库的设计(2)

续第一篇,前两天对核心存储做了些修改,以前只打算与关系数据库的行与表做对应,value类型只能使array或list, 现在把7种基本类型也加入到value支持...

37980
来自专栏Pythonista

MacOs执行SQL出错(mysql)

11530
来自专栏破晓之歌

Restful API实战 原

举例:需要请求获取服务器允许我对服务器进行哪些操作,可以用OPTIONS请求。还有类似访问频率参数

19220

扫码关注云+社区

领取腾讯云代金券