加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

一个 MySQL 分库分表php类

发布时间:2020-05-25 07:24:40 所属栏目:PHP 来源:互联网
导读:一个 MySQL 分库分表php类

下面是脚本之家 jb51.cc 通过网络收集整理的代码片段。

脚本之家小编现在分享给大家,也给大家做个参考。

    <?php  
    /** 
     * User: guoyu 
     * Date: 14-8-12 
     * Time: 下午3:16 
     */  
       
    namespace AppModelDatabase;  
       
    class Config  
    {  
        public $dsn;  
        public $user;  
        public $password;  
        /** 
         * @var string 分库分表后得到的数据库名 
         */  
        public $dbname;  
        /** 
         * @var string 分库分表后得到的表名 
         */  
        public $table;  
       
        /** 
         * @var array MySQL 配置数组 
         */  
        private static $config;  
       
        /** 
         * @var string 配置文件路径 
         */  
        private static $configFile = 'mysql.php';  
       
        public function __construct($dbname,$table,$id = 0)  
        {  
            if (is_null(static::$config)) {  
                $config = include(static::$configFile);  
                static::$config = $config;  
            }  
       
            $config = static::$config;  
            if (isset($config['shared']) && isset($config['shared'][$dbname])) {  
                $dbconfig = $config['shared'][$dbname];  
                $id = is_numeric($id) ? (int)$id : crc32($id);  
                $database_id = ($id / $dbconfig['database_split'][0]) % $dbconfig['database_split'][1];  
                $table_id = ($id / $dbconfig['table_split'][0]) % $dbconfig['table_split'][1];  
       
                foreach ($dbconfig['host'] as $key => $conf) {  
                    list($from,$to) = explode('-',$key);  
                    if ($from <= $database_id && $database_id <= $to) {  
                        $the_config = $conf;  
                    }  
                }  
       
                $this->dbname = $dbname . '_' . $database_id;  
                $this->table = $table . '_' . $table_id;  
            } else {  
                $this->dbname = $dbname;  
                $this->table = $table;  
                $the_config = $config['db'][$dbname];  
            }  
            $c = $the_config;  
            if (isset($c['unix_socket']) && $c['unix_socket']) {  
                $this->dsn = sprintf('mysql:dbname=%s;unix_socket=%s',$this->dbname,$c['unix_socket']);  
            } else {  
                $this->dsn = sprintf('mysql:dbname=%s;host=%s;port=%s',$c['host'],$c['port']);  
            }  
            $this->user = $c['user'];  
            $this->password = $c['password'];  
        }  
       
    }  


Config 类就做一个事情,根据配置文件,去拿到对应的库和表的链接配置,然后客户可以根据 dsn 去链接对应的数据库。对应的配置文件如下:

[php] view plaincopyprint?在CODE上查看代码片派生到我的代码片

    <?php  
    /** 
     * User: guoyu 
     * Date: 14-8-6 
     * Time: 上午11:19 
     */  
       
    $default = array(  
        'unix_socket' => null,'host' => 'localhost','port' => '3306','user' => 'root','password' => '',);  
       
    $config = array(  
        // 不进行分库分表的数据库  
        'db' => array(  
            'my_site' => $default,),// 分库分表  
        'shared' => array(  
            'user' => array(  
                'host' => array(  
                    /** 
                     * 编号为 0 到 10 的库使用的链接配置 
                     */  
                    '0-10' => $default,/** 
                     * 编号为 11 到 28 的库使用的链接配置 
                     */  
                    '11-28' => $default,/** 
                     * 编号为 29 到 99 的库使用的链接配置 
                     */  
                    '29-99' => $default,// 分库分表规则  
                /** 
                 * 下面的配置对应百库百表 
                 * 如果根据 uid 进行分表,假设 uid 为 543234678,对应的库表为: 
                 *  (543234678 / 1) % 100 = 78 为编号为 78 的库 
                 *  (543234678 / 100) % 100 = 46 为编号为 46 的表 
                 */  
                'database_split' => array(1,100),'table_split' => array(100,);  
       
       
    return $config;  


给出一个使用这个分库分表的例子:

[php] view plaincopyprint?在CODE上查看代码片派生到我的代码片

    <?php  
    /** 
     * User: guoyu 
     * Date: 14-8-6 
     * Time: 上午10:23 
     */  
       
    namespace AppModel;  
       
    use AppModelDatabaseConfig;  
    use PDO;  
       
    abstract class Model  
    {  
        /** 
         * @var Config 
         */  
        public $config;  
       
        /** 
         * @var PDO 
         */  
        public $connection;  
       
        protected $dbnamePrefix;  
        protected $tablePrefix;  
       
        /** 
         * @var string 分库分表后对应的表 
         */  
        protected $table;  
       
        public function __construct($id)  
        {  
            $this->config = new Config($this->dbnamePrefix,$this->tablePrefix,$id);  
            $this->connection = new Pdo($this->config->dsn,$this->config->user,$this->config->password);  
            $this->table = $this->config->table;  
        }  
       
        public function update(array $data,array $where = array())  
        {  
       
        }  
       
        public function select(array $where)  
        {  
       
        }  
       
        public function insert(array $data)  
        {  
       
        }  
       
        public function query($sql)  
        {  
            return $this->connection->query($sql);  
        }  
    }  

下面这个例子展示了如何使用上述的 Model 类:
    <?php  
    /** 
     * User: guoyu 
     * Date: 14-8-12 
     * Time: 下午4:06 
     */  
       
    require 'Config.php';  
    require 'Model.php';  
       
    use AppModelModel;  
       
    class User extends Model  
    {  
        protected $dbnamePrefix = 'user';  
        protected $tablePrefix = 'userinfo';  
    }  
       
    $user = new User(4455345345);  
       
    print_r($user);  

来自:http://blog.csdn.net/phpfenghuo/article/details/45342311

以上是脚本之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读