indievox/master-slave-db-access

简单的 MySQL 数据库服务器访问类,使用 POD 及单例模式实现,支持主从架构。 / 简单的 MySQL 数据库服务器访问类使用 PDO 和单例模式,支持主从数据库集群。

0.0.1 2016-03-29 09:02 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:20:43 UTC


README

Latest Stable Version Build Status codecov.io Codacy Badge

简单的 MySQL 数据库服务器访问类,使用 POD 及单例模式实现,支持主从架构。

简单的 MySQL 数据库服务器访问类使用 PDO 和单例模式,支持主从数据库集群。

用法

使用 composer 安装

composer require indievox/master-slave-db-access:dev-master

包含自动加载

require_once "/path/to/your/vendor/autoload.php";
use iNDIEVOX\MasterSlaveDBAccess\MasterSlaveDBAccess;

配置数据库连接

以下为数据库连接配置示例

$db_config = array(
    "database_server" => array(
        "master"=>array(
            "db_host"=>'localhost', // change to your master host
            "db_name"=>'homestead', // change to your master database name
            "db_user"=>'root',      // change to your master database username
            "db_password"=>''       // change to your master database password
        ),
        "slave1"=>array(
            "db_host"=>'localhost', // change to your slave host
            "db_name"=>'homestead', // change to your slave database name
            "db_user"=>'root',      // change to your slave database username
            "db_password"=>''       // change to your slave database password
        ),
        "slave2"=>array(
            "db_host"=>'localhost', // change to your slave host
            "db_name"=>'homestead', // change to your slave database name
            "db_user"=>'root',      // change to your slave database username
            "db_password"=>''       // change to your slave database password
        )
    ),
    "slave_database_name" => array(
        'slave1',
        'slave2'
    )
);

获取数据库访问实例

$db_obj = MasterSlaveDBAccess::getInstance($db_config);

使用数据库访问实例执行查询

$select_sql = "SELECT id, email FROM user WHERE id=:id ";
$param = array(
    ":id" => '1'
);
$query_result = $db_obj->selectCommand($select_sql, $param);

foreach ($query_result as $query_result_data) {
    echo $query_result_data["id"];
    echo $query_result_data["email"];
}

当需要时强制读取主数据库

MasterSlaveDBAccess::forceSwitchMaster();

$select_sql = "SELECT id, email FROM user WHERE id=:id ";

$param = array(
    ":id" => '1'
);

// select query, but use master only this time
$query_result = $db_obj->selectCommand($select_sql, $param);

foreach ($query_result as $query_result_data) {
    echo $query_result_data["id"];
    echo $query_result_data["email"];
}

$select_sql = "SELECT id, email FROM user WHERE id=:id ";

$param = array(
    ":id" => '1'
);

// select query, auto switch to slave(read)
$query_result = $db_obj->selectCommand($select_sql, $param);

foreach ($query_result as $query_result_data) {
    echo $query_result_data["id"];
    echo $query_result_data["email"];
}

使用 "right" 方法执行查询,类会自动切换到正确的读写连接来处理查询

use iNDIEVOX\MasterSlaveDBAccess\MasterSlaveDBAccess;

$db_config = array(
    "database_server" => array(
        "master"=>array(
            "db_host"=>'localhost',
            "db_name"=>'homestead',
            "db_user"=>'root',
            "db_password"=>''
        ),
        "slave1"=>array(
            "db_host"=>'localhost',
            "db_name"=>'homestead',
            "db_user"=>'root',
            "db_password"=>''
        ),
        "slave2"=>array(
            "db_host"=>'localhost',
            "db_name"=>'homestead',
            "db_user"=>'root',
            "db_password"=>''
        )
    ),
    "slave_database_name" => array(
        'slave1',
        'slave2'
    )
);

// init conneciton, use slave(read) connection
$db_obj = MasterSlaveDBAccess::getInstance($db_config);

$insert_sql = "INSERT INTO user ".
    "(id, path, is_deleted, create_time, modify_time, delete_time) ".
    "VALUES ".
    "(:id, :path, :is_deleted, :create_time, :modify_time, :delete_time);";

$param = array(
    ":id"           => '1',
    ":path"         => 'fukuball',
    ":is_deleted"   => '0',
    ":create_time"  => '2016-12-30 00:00:00',
    ":modify_time"  => '2016-12-30 16:12:18',
    ":delete_time"  => '0000-00-00 00:00:00'
);

// insert query, auto switch to master(write)
$insert_id = $db_obj->insertCommand($insert_sql, $param);

$select_sql = "SELECT * FROM user WHERE id=:id ";

$param = array(
    ":id" => '1'
);

// select query, auto switch to slave(read)
$query_result = $db_obj->selectCommand($select_sql, $param);

foreach ($query_result as $query_result_data) {
    echo $query_result_data["id"];
    echo $query_result_data["email"];
}

$update_sql = "UPDATE user SET path='fukuball-lin' WHERE id=:id ";

$param = array(
    ":id" => '1'
);

// update query, auto switch to master(write)
$affected_rows = $db_obj->updateCommand($update_sql, $param);

$delete_sql = "DELETE FROM user WHERE id=:id ";

$param = array(
    ":id" => '1'
);

// delete query, auto switch to master(write)
$affected_rows = $db_obj->deleteCommand($delete_sql, $param);

有时你希望在整个上下文中使用主服务器

// init conneciton, use slave(read) connection
$db_obj = MasterSlaveDBAccess::getInstance($db_config);

// switch to master
MasterSlaveDBAccess::forceSwitchMasterWholeContext();

$select_sql = "SELECT * FROM user WHERE id=:id ";

$param = array(
    ":id" => '1'
);

// select query, but use master
$query_result = $db_obj->selectCommand($select_sql, $param);

$insert_sql = "INSERT INTO user ".
    "(id, path, is_deleted, create_time, modify_time, delete_time) ".
    "VALUES ".
    "(:id, :path, :is_deleted, :create_time, :modify_time, :delete_time);";

$param = array(
    ":id"           => '2',
    ":path"         => 'punkball',
    ":is_deleted"   => '0',
    ":create_time"  => '2016-12-31 00:00:00',
    ":modify_time"  => '2016-12-31 16:12:18',
    ":delete_time"  => '0000-00-00 00:00:00'
);

// insert query, use master
$insert_id = $db_obj->insertCommand($insert_sql, $param);

$select_sql = "SELECT * FROM user WHERE id=:id ";

$param = array(
    ":id" => '2'
);

// select query, but use master
$query_result = $db_obj->selectCommand($select_sql, $param);

许可证

MIT 许可证 (MIT)

版权所有 (c) 2016 iNDIEVOX

在此特此授予任何获得本软件及其相关文档副本(“软件”)的人免费使用权,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供的人以本软件的方式使用,但须遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“现状”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、适用于特定目的和不侵犯版权的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些责任是在合同行为、侵权行为或其他行为中产生的,也不论这些责任是否与软件或其使用或其他操作有关。